Archiviazione tar che accetta input da un elenco di file


166

Ho un file che contiene un elenco di file che voglio archiviare con tar. Chiamiamolomylist.txt

Contiene:

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

Esiste un modo per emettere il comando TAR che accetta mylist.txtcome input? Qualcosa di simile a

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

In modo che sia simile come se emettessi questo comando:

tar -cvf allfiles.tar file1.txt file2.txt file10.txt 

4
La pagina man tar è estremamente inutile per questa opzione (almeno su RedHat da 5.4 a 6.3): "-T: ottieni nomi da estrarre o creare dal file F". "Estrai o crea" suona come si applica per estrarre i file dall'archivio tar, ma non inserirli. L' -Xopzione di esclusione sopravvive al vecchio comando tar Unix, ma a quanto pare -I (include) no!
Ogre Salmo33,

Ci sono poche manpagine con una EXAMPLESsezione, nonostante sia una sezione standard . Vedi < unix.stackexchange.com/questions/306189/… >.
Sam Boosalis,

Risposte:


262

Sì:

tar -cvf allfiles.tar -T mylist.txt

Vorrei poter inserire commenti in mylist.txt .. c'è qualche soluzione usando un'opzione tar all'interno di mylist.txt?
Stphane

7
@Stphane è semplice, l'utilizzo del flag --exclude lo consente. Supponendo che le righe dei commenti inizino con un '#', un comando come il seguente ignorerebbe / escluderebbe qualsiasi tentativo di operazioni sui file su righe contenenti cmment, ovvero il comando può apparire così: tar -cvf allfiles.tar --exclude = '^ # '-T mylist.txt. Tar segnala un errore, ma quando si controlla l'archivio tar, non si verificano errori e tutti i file dell'elenco si trovano all'interno dell'archivio.
Matt G

Sottolineando che questo comando è per la variante linux e per quelli su sunOS o altre varianti, controlla le altre risposte di seguito. Ad esempio, per sunOS, ho provato due alternative: tar -cvf file.tar -I list.txt e tar -cvf file.tar $ (cat list.txt)
Nasri Najib

-L mylist.txtsu AIX
Roland

82

Supponendo che GNU tar (poiché si tratta di Linux), l' opzione -To --files-fromè ciò che si desidera.


3
Questa opzione esiste anche in "bsdtar 3.1.2" su FreeBSD 10.
drue

33

Puoi anche inserire i nomi dei file che potrebbero essere utili:

find /path/to/files -name \*.txt | tar -cvf allfiles.tar -T -

2
Cosa succede se l'elenco dei file .txt è davvero enorme? Si dovrebbe usare il comando xarg con tar -r .. invece di tar -c ..?
Stphane,

1
@Stphane Hmm, non credo che la lunghezza dell'elenco sia molto importante per questo metodo. In effetti, immaginerei che questo metodo sia migliore di xargs poiché gli xarg eseguiranno nuovamente tar per aggiungere dati, ma non ho davvero testato i metodi fianco a fianco.
woot

2
Quando viene utilizzata una pipe, come in questo caso, il sistema operativo crea flussi su entrambi i lati della pipe e sincronizza la produzione e il consumo dei dati. L'elenco dei file potrebbe essere infinito. È possibile eseguire il tar / gz dell'intera Internet utilizzando un Raspberry Pi Zero, dato che si dispone di spazio di archiviazione sufficiente sull'estremità del tubo.
Richard Gomes,

14

Alcune versioni di tar, ad esempio le versioni predefinite su HP-UX (ho provato 11.11 e 11.31), non includono un'opzione della riga di comando per specificare un elenco di file, quindi una soluzione decente è fare questo:

tar cvf allfiles.tar $(cat mylist.txt)

4
UUoC (uso non necessario di cat), semplicemente $(<mylist.txt).
David C. Rankin,

2
nota che questo può superare la lunghezza massima della riga di comando se mylist.txtè grande
Andre Holzner il

in quel caso tar -T <(<mylist.txt). ridondante come questa risposta.
Mike D,

7

Su Solaris, è possibile utilizzare l'opzione -I per leggere i nomi dei file che normalmente si dichiarerebbero sulla riga di comando da un file. Contrariamente alla riga di comando, questo può creare archivi tar con centinaia di migliaia di file (appena fatto).

Quindi l'esempio potrebbe essere letto

tar -cvf allfiles.tar -I mylist.txt

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.