Archivage tar qui prend l'entrée d'une liste de fichiers


167

J'ai un fichier qui contient la liste des fichiers que je veux archiver avec tar. Appelons çamylist.txt

Il contient:

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

Existe-t-il un moyen d'émettre une commande TAR qui prend mylist.txtcomme entrée? Quelque chose comme

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

Pour que ce soit comme si j'émettais cette commande:

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

4
La page de manuel tar est extrêmement inutile pour cette option (au moins sur RedHat 5.4 à 6.3): "-T: obtenir les noms à extraire ou créer à partir du fichier F". «Extraire ou créer» sonne comme s'il s'agissait de retirer des fichiers de l'archive tar, mais pas de les -Xinsérer . L' option d'exclusion survit de l'ancienne commande tar d'Unix, mais apparemment -I (include) ne l'a pas fait!
Ogre Psalm33

Il y a peu de manpages avec une EXAMPLESsection, bien qu'il s'agisse d'une section standard . Voir < unix.stackexchange.com/questions/306189/... >.
sam boosalis le

Réponses:


263

Oui:

tar -cvf allfiles.tar -T mylist.txt

J'aimerais pouvoir mettre des commentaires dans mylist.txt .. y a-t-il une solution de contournement en utilisant une option tar à l'intérieur de mylist.txt?
Stphane

7
@Stphane c'est simple, l'utilisation de l'indicateur --exclude le permet. En supposant que vos lignes de commentaires commencent par un '#', une commande comme celle-ci ignorerait / exclurait toute tentative d'opération sur les fichiers sur les lignes contenant des cmments, c'est-à-dire que votre commande peut ressembler à ceci: tar -cvf allfiles.tar --exclude = '^ # '-T mylist.txt. Tar signale une erreur, mais lorsque vous vérifiez votre archive tar, il n'y a aucune erreur et tous les fichiers de la liste se trouvent dans votre archive.
Matt G

Soulignant que cette commande est pour la variante Linux et pour ceux sur sunOS ou d'autres variantes, consultez les autres réponses ci-dessous. Par exemple, pour sunOS, deux alternatives que j'ai testées: tar -cvf file.tar -I list.txt et tar -cvf file.tar $ (cat list.txt)
Nasri Najib

-L mylist.txtsur AIX
Roland

82

En supposant que GNU tar (car c'est Linux), l' option -Tou --files-fromest ce que vous voulez.


3
Cette option existe aussi dans "bsdtar 3.1.2" sur FreeBSD 10.
drue

33

Vous pouvez également diriger les noms de fichiers qui pourraient être utiles:

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

2
Et si la liste des fichiers .txt est vraiment énorme? Doit-on utiliser la commande xarg avec tar -r .. au lieu de tar -c ..?
Stphane

1
@Stphane Hmm, je ne pense pas que la longueur de la liste importe beaucoup pour cette méthode. En fait, j'imagine que cette méthode est meilleure que xargs car xargs réexécutera tar à plusieurs reprises pour ajouter des données, mais je n'ai pas vraiment testé les méthodes côte à côte.
woot

2
Lorsqu'un tuyau est utilisé, ce qui est le cas ici, le système d'exploitation crée des flux de part et d'autre du tuyau et synchronise la production et la consommation des données. La liste des fichiers peut être infinie. Vous pouvez tarer / gz l'intégralité de l'Internet à l'aide d'un Raspberry Pi Zero, étant donné que vous avez suffisamment de stockage à l'extrémité du tuyau.
Richard Gomes

14

Certaines versions de tar, par exemple, les versions par défaut sur HP-UX (j'ai testé 11.11 et 11.31), n'incluent pas d'option de ligne de commande pour spécifier une liste de fichiers, donc une solution de contournement décente est de faire ceci:

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

4
UUoC (utilisation inutile de cat), simplement $(<mylist.txt).
David C. Rankin

2
notez que cela peut dépasser la longueur maximale de la ligne de commande si elle mylist.txtest grande
Andre Holzner

dans ce cas tar -T <(<mylist.txt). redondant comme cette réponse.
Mike D

7

Sous Solaris, vous pouvez utiliser l'option -I pour lire les noms de fichiers que vous indiqueriez normalement sur la ligne de commande à partir d'un fichier. Contrairement à la ligne de commande, cela peut créer des archives tar avec des centaines de milliers de fichiers (c'est ce que j'ai fait).

Donc l'exemple lirait

tar -cvf allfiles.tar -I mylist.txt

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.