Tar arquivos grandes em diferentes diretórios

0

Eu tenho ~ 20 arquivos, cada um com cerca de 10 GB, em pastas diferentes que eu preciso compactar em um único tar. Não é prático copiá-los todos para um único local. Mais precisamente, os arquivos são organizados assim:

index1_index2 / subpasta / bigfile.dat

Aqui index1 e index2 variam em alguns valores.

O que é uma maneira prática de obter um único tarball contendo todos esses arquivos, digamos, com bash ou algo assim?

    
por mikefallopian 15.11.2015 / 21:32

2 respostas

4

Se eles estiverem no mesmo sistema de arquivos, você poderá vinculá-los a um diretório comum e tar esse diretório.

Alternativamente, se você estiver usando o GNU tar, você poderia (com um pouco mais de flexibilidade) vinculá-los a um diretório comum e usando sua opção -h , tar os arquivos para os quais os links apontam.

A página de manual do último mostra :

-h, --dereference

follow symlinks; archive and dump the files they point to

O tar do FreeBSD suporta opções equivalentes, mas nomeia-as como pax (veja abaixo).

Não há, claro, tar POSIX para usar para comparação. Se você puder usar pax , ele terá uma opção -L semelhante:

-L
If a symbolic link referencing a file of type directory is specified on the command line or encountered during the traversal of a file hierarchy, pax shall archive the file hierarchy rooted in the file referenced by the link, using the name of the link as the root of the file hierarchy. Otherwise, if a symbolic link referencing a file of any other file type which pax can normally archive is specified on the command line or encountered during the traversal of a file hierarchy, pax shall archive the file referenced by the link, using the name of the link. The default behavior, when neither -H or -L are specified, shall be to archive the symbolic link itself.

Seja hard-linking ou soft-linking, o resultado é que você não precisa mover seus arquivos existentes. Hard-linking muda o ctime (timestamp) dos seus arquivos, enquanto a soft-linking não. Mas soft-linking (embora reduza a necessidade de estar no mesmo sistema de arquivos) não é universalmente suportado por implementações de tar usando opções idênticas.

A declaração original do OP parecia indicar que a razão pela qual era inconveniente colocar todos os arquivos juntos em um diretório era devido a alguma limitação do aplicativo que os gerava. Esclarecimento torna aparente que o problema é que todos eles têm o mesmo nome de arquivo. Embora a vinculação em um diretório (e, por exemplo, a codificação do diretório original no local comum) seja certamente possível, existem outras opções para simplesmente coletar os arquivos em um único archive, mantendo seus nomes de diretório existentes. Uma desvantagem de fazer isso é que limita a capacidade de restaurar em locais arbitrários. No entanto: a maneira mais simples de passar alguns ~ 20 nomes para o tar seria na linha de comando, por exemplo,

'tar czf myoutput.tar.gz $(find . -type f -name bigfile.dat)'

Somente para 20 arquivos que provavelmente não serão um problema com o tamanho da linha de comando. Se fosse um grande número de arquivos (ou nomes de caminho muito longos), isso tornaria mais difícil, já que tar implementações geralmente não têm a capacidade de passar uma lista de nomes de caminho além de parâmetros de linha de comando separados (veja . Para aqueles, pode-se tentar contornar a limitação criando um arquivo em etapas - mas isso não funcionaria com a compactação. Algumas implementações fornecem opções para ler uma lista de nomes de arquivos de um arquivo. A opção GNU tar -T (também do FreeBSD) faz isso. Outros programas podem fornecer uma terceira alternativa, lendo a lista de nomes de arquivos a partir da entrada padrão (como feito por pax , que foi influenciada por cpio ), mas geralmente tar não: ele pode ler o arquivo conteúdo da entrada padrão.

    
por 15.11.2015 / 21:59
0

A maneira mais direta é:

tar cfz bigtar.tar.gz /path/to/file1 /path/to/file2 ... /path/to/file20

Se houver similaridades de correspondência entre os arquivos de destino, você poderá usar find para criar a lista de arquivos e o tar ( -T ) do --files-from do GNU.

por exemplo. se todos forem arquivos .mp4:

find /path -type -f -iname '*.mp4' | tar cf bigtar.tar -T -

Caso contrário, se não houver um padrão fácil para selecionar seus nomes de arquivos, você poderá usar find para criar uma lista inicial em um arquivo tmp, editá-lo manualmente para remover nomes de arquivos que não deseja incluir no tar e usar o nome editado. nome do tmpfile com a opção -T do tar.

    
por 15.11.2015 / 22:59