Arquivos TAR: Mover arquivos de subdiretórios para o diretório principal

1

Estou tentando usar este código:

find documents -maxdepth 1 -type f -print0 | xargs -0 tar cvf documents.tar.gz

para criar um backup dos documentos do diretório.

O diretório tem a estrutura:

Eeuqueroarquivá-losemdocumentosdediretórioúnico/:

Mas não consigo fazer isso. Como posso fazer isso? Obrigado

    
por Mr. Smoke 13.12.2014 / 15:02

4 respostas

1

Você pode vinculá-los em um diretório diferente e depois em tar

# find all files in directory named directory
find directory -type f | \
while read f;
do
    f2='echo "$f"|sed -e 's/\//:/g''  # replace / with :
    ln "$f" "directory2/$f2"  # create hardlinks in directory2/
done

Isso criará os seguintes links

directory/file1 => directory2/directory:file1
directory/file2 => directory2/directory:file2
directory/folder1/file3 => directory2/directory:folder1:file3
directory/folder1/file4 => directory2/directory:folder1:file4
directory/folder2/file5 => directory2/directory:folder2:file5
directory/folder3/folder4/file6 => directory2/directory:folder3:folder4:file6
directory/folder3/folder4/file7 => directory2/directory:folder3:folder4:file7
    
por 13.12.2014 / 17:09
0

Eu acho que a maneira de fazer isso é criar um novo diretório como fonte de backup e preenchê-lo com hardlinks. Espero que toda a árvore de diretórios que você deseja fazer backup esteja no mesmo volume.

> pwd
/path/to/documents
> cd /path/to/
> mkdir tar-documents
> mkdir tar-documents/documents
> ln /path/to/documents/file1
> ln /path/to/documents/file2
> ln /path/to/documents/folder1/file3 folder1:file3
[...]

Se o número de arquivos for alto, isso deve ser feito por um script.

Depois, você executa tar neste diretório:

> cd /path/to/tar-documents
> tar cvzf /backup/path/documents.tar.gz documents

No final, pode ser útil excluir o diretório tar .

    
por 13.12.2014 / 16:07
0

Você pode tentar isso.

Encontre todos os arquivos *tar na pasta atual e copie para a pasta MainDirectory ou para onde você quiser.

find . -iname "*tar*" -exec cp {} ~/MainDirectory/ \;

    
por 13.12.2014 / 16:42
0

Primeiramente, se você deseja arquivar um diretório, ter a mesma estrutura de arquivos no arquivamento é a melhor prática para obter esse instantâneo. O que você está pedindo é a renomeação de seus arquivos para incluir seus diretórios pai com sucesso por dois pontos seguidos pelo nome do arquivo. Por mais estranho que isso esteja fora de contexto, eu consegui me aproximar bastante usando a opção --transform :

 --transform=EXPRESSION, --xform=EXPRESSION
                         use sed replace EXPRESSION to transform file

Um exemplo disso é descrito em esta resposta do stackexchange (Embora esteja ciente de que não é adequada sintaxe sed ) . Usando --transform , seu comando seria este:

tar czvf documents.tar.gz --transform 's/\//:/g' documents

Infelizmente, isso não teve o efeito desejado, pois mantém seus subdiretórios no arquivo, mas eles estão vazios e os arquivos estão na raiz do arquivo, não no primeiro diretório pai.

Eu pensei que tinha uma solução para você usando a opção -C, --directory , mas não seria muito dinâmica, nem seria acomodar para manter os nomes de diretório dos arquivos no novo nome de arquivo.

A solução que encontrei é um híbrido do que você tem e o uso do comando transform:

find documents -type f -print0 | xargs -0 tar czvf test.tar.gz --no-recursion --transform 's/\//:/g' --transform 's:\::/:1' documents/

Além disso, na sua pergunta, nomeie seu arquivo com a extensão .gz , mas faltou a opção -z, --gzip .

Espero que isso ajude,
Alex

    
por 04.11.2016 / 21:10

Tags