219 votes

Archivage Tar qui prend en entrée une liste de fichiers

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

Il contient :

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

Y a-t-il un moyen de lancer une commande TAR qui prend mylist.txt comme entrée ? Quelque chose comme

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

Pour que ce soit similaire à ce que je fais avec cette commande :

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

4 votes

La page de manuel tar est extrêmement peu utile pour cette option (au moins sur RedHat 5.4 à 6.3) : "-T : get names to extract or create from file F". "Extraire ou créer" semble s'appliquer à l'extraction de fichiers de l'archive tar, mais pas à leur insertion. Le site -X L'option exclude a survécu à l'ancienne commande Unix tar, mais apparemment pas l'option -I (include) !

0 votes

Il y a peu man pages avec un EXAMPLES bien qu'il s'agisse d'une section standard . Voir < unix.stackexchange.com/questions/306189/ >.

341voto

Loki Astari Points 116129

Oui :

tar -cvf allfiles.tar -T mylist.txt

1 votes

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

9 votes

@Stphane c'est simple, l'utilisation du drapeau --exclude permet cela. En supposant que vos lignes de commentaires commencent par un '#', une commande telle que la suivante ignorera / exclura toute tentative d'opération de fichier sur les lignes contenant des commentaires, 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 sont dans votre archive.

0 votes

En précisant que cette commande est pour la variante linux et pour ceux qui sont sous 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)

92voto

Simon Richter Points 11471

En supposant que GNU tar (car il s'agit de Linux), le fichier -T o --files-from est ce que vous voulez.

3 votes

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

59voto

woot Points 2407

Vous pouvez également introduire les noms de fichiers dans le pipe, ce qui peut être utile :

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

2 votes

Que faire si la liste des fichiers .txt est vraiment énorme ? Faut-il utiliser la commande xarg avec tar -r.. au lieu de tar -c.. ?

3 votes

@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 celle de xargs, car xargs réexécute tar encore et encore pour ajouter des données, mais je n'ai pas vraiment testé les méthodes côte à côte.

6 votes

Lorsqu'un pipe est utilisé, ce qui est le cas ici, le système d'exploitation crée des flux des deux côtés du pipe et synchronise la production et la consommation de données. La liste des fichiers pourrait être infinie. Vous pourriez tar/gzer tout l'Internet à l'aide d'un Raspberry Pi Zero, à condition d'avoir suffisamment de stockage à l'extrémité du tuyau.

21voto

barush Points 33

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 le faire :

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

6 votes

UUoC (utilisation inutile de cat ), simplement $(<mylist.txt) .

5 votes

Notez que cela peut dépasser la longueur maximale de la ligne de commande si mylist.txt est grande

0 votes

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

10voto

Jan Points 149

Sous Solaris, vous pouvez utiliser l'option -I pour lire les noms de fichiers que vous énonceriez 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 (je viens de le faire).

L'exemple serait donc le suivant

tar -cvf allfiles.tar -I mylist.txt

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X