Arquivamento de alcatrão que recebe entrada de uma lista de arquivos

166

Eu tenho um arquivo que contém a lista de arquivos que eu quero arquivar com o tar. Vamos chamá-lomylist.txt

Contém:

file1.txt
file2.txt
...
file10.txt

Existe uma maneira de emitir o comando TAR que usa mylist.txtcomo entrada? Algo como

tar -cvf allfiles.tar -[someoption?] mylist.txt

Para que seja semelhante como se eu emitisse este comando:

tar -cvf allfiles.tar file1.txt file2.txt file10.txt 
neversaint
fonte
4
A página do manual tar é extremamente inútil para esta opção (pelo menos no RedHat 5.4 a 6.3): "-T: obtém nomes para extrair ou criar do arquivo F". "Extrair ou criar" soa como se aplica a retirar arquivos do arquivo tar, mas não colocá-los. A -Xopção de exclusão sobrevive do antigo comando tar do Unix, mas aparentemente -I (include) não!
Ogre Psalm33
Existem poucas manpáginas com uma EXAMPLESseção, apesar de ser uma seção padrão . Consulte < unix.stackexchange.com/questions/306189/… >.
sam boosalis

Respostas:

262

Sim:

tar -cvf allfiles.tar -T mylist.txt
Martin York
fonte
Eu gostaria de poder colocar comentários em mylist.txt .. existe alguma solução alternativa usando alguma opção tar de dentro de mylist.txt?
Stphane
7
@ Stphane que é simples, usando o sinalizador --exclude permite isso. Supondo que suas linhas de comentário comecem com um '#', um comando como o seguinte ignoraria / excluiria qualquer tentativa de operação de arquivo em linhas contendo cmments, ou seja, seu comando pode ser assim: tar -cvf allfiles.tar --exclude = '^ # '-T mylist.txt. O Tar relata um erro, mas quando você verifica seu arquivo tar, não há erros e todos os arquivos da lista estão dentro do seu arquivo.
Matt G
Assinalando que este comando é para a variante linux e para aqueles no sunOS ou outras variantes, verifique as outras respostas abaixo. Por exemplo, para SunOS, duas alternativas que eu testei: (list.txt gato) tar -cvf arquivo.tar -I list.txt e tar -cvf arquivo.tar $
Nasri Najib
-L mylist.txtno AIX
Roland
82

Supondo o tar GNU (como este é o Linux), a opção -Tou --files-fromé o que você deseja.

Simon Richter
fonte
3
Essa opção também existe no "bsdtar 3.1.2" no FreeBSD 10.
drue 23/06
33

Você também pode inserir os nomes dos arquivos que podem ser úteis:

find /path/to/files -name \*.txt | tar -cvf allfiles.tar -T -
woot
fonte
2
E se a lista de arquivos .txt for realmente grande? Deve-se usar o comando xarg com tar -r .. em vez de tar -c ..?
Stphane
1
@ Stphane Hmm, não acho que o comprimento da lista seja muito importante para esse método. Na verdade, eu imagino que esse método seja melhor que o xargs, pois o xargs executará o tar repetidamente para acrescentar dados, mas eu realmente não testei os métodos lado a lado.
Woot
2
Quando um tubo é empregado, como é o caso aqui, o sistema operacional cria fluxos nos dois lados do tubo e sincroniza a produção e o consumo de dados. A lista de arquivos pode ser infinita. Você pode tar / gz toda a Internet usando um Raspberry Pi Zero, desde que você tenha armazenamento suficiente na extremidade do tubo.
Richard Gomes
14

Algumas versões do tar, por exemplo, as versões padrão no HP-UX (eu testei 11.11 e 11.31), não incluem uma opção de linha de comando para especificar uma lista de arquivos, portanto, uma solução alternativa decente é fazer isso:

tar cvf allfiles.tar $(cat mylist.txt)
barush
fonte
4
UUoC (uso desnecessário de cat), simplesmente $(<mylist.txt).
David C. Rankin
2
notar que este pode exceder o comprimento máximo da linha de comando, se mylist.txté grande
Andre Holzner
nesse caso tar -T <(<mylist.txt). redundante como esta resposta.
Mike D
7

No Solaris, você pode usar a opção -I para ler os nomes de arquivos que você normalmente indicaria na linha de comando de um arquivo. Em contraste com a linha de comando, isso pode criar arquivos tar com centenas de milhares de arquivos (apenas isso).

Então o exemplo seria

tar -cvf allfiles.tar -I mylist.txt
Jan
fonte
3

Para mim, no AIX, funcionou da seguinte maneira:

tar -L List.txt -cvf BKP.tar
Cassiano Bucci
fonte