web-dev-qa-db-fra.com

Comment puis-je construire un goudron à partir de stdin?

Comment puis-je canaliser les informations dans tar en spécifiant les noms du fichier?

60
Kristopher Ives

Quelque chose comme:

tar cfz foo.tgz -T -

Mais gardez à l'esprit que cela ne fonctionnera pas pour tous les noms de fichiers possibles; vous devriez considérer l'option --null et alimenter tar à partir de find -print0. (L'exemple xargs ne fonctionnera pas vraiment pour les listes de fichiers volumineuses, car il engendrera plusieurs commandes tar.)

88
geekosaur

Comme déjà signalé par geekosaur, il n'est pas nécessaire de diriger la sortie de find vers xargs car il est possible de diriger directement la sortie de find vers tar à l'aide de find ... -print0 | tar --null ....

Notez les légères différences entre gnutar et bsdtar en excluant le fichier archive cependant.

# exclude file.tar.gz anywhere in the directory tree to be tar'ed and compressed
find . -print0 | gnutar --null --exclude="file.tar.gz" --no-recursion -czf file.tar.gz --files-from -
find . -print0 | bsdtar --null --exclude="file.tar.gz" -n -czf file.tar.gz -T -

# bsdtar excludes ./file.tar.gz in current directory by default
# further file.tar.gz files in subdirectories will get included though
# bsdtar: ./file.tar.gz: Can't add archive to itself
find . -print0 | bsdtar --null -n -czf file.tar.gz -T -

# gnutar does not exclude ./file.tar.gz in current directory by default
find . -print0 | gnutar --null --no-recursion -czf file.tar.gz --files-from -
22
marco

Extension de réponse du géekosaure :

find /directory | tar -cf archive.tar -T -

Vous pouvez utiliser stdin avec l'option -T.

Notez que si vous filtrez les fichiers en utilisant certaines conditions (par exemple, l'option -name), vous devez généralement exclure les répertoires dans le canal, sinon tar traitera tout leur contenu, ce qui n'est pas ce que vous souhaitez. Alors, utilisez:

find /directory -type f -name "mypattern" | tar -cf archive.tar -T -

Si vous n'utilisez pas -type, tout le contenu des répertoires correspondant à "mypattern" sera ajouté!

15
John Sinclair

Au lieu d’utiliser un tuyau, vous pouvez utiliser des piques, par exemple:

tar cvzf archive.tgz `ls -1 *`

Au lieu de ls -1 *, vous pouvez mettre toute autre commande générant la liste des fichiers nécessaires

5
Laimoncijus
find /directory > filename
tar -T filename -cf archive.tar
4
Felipe Alvarez

Pour une meilleure compression, utiliser bzip2 peut être utile.

find $PWD -name "*.doc" > doc.filelist
tar -cvjf jumbo.tar.bz2 -T doc.filelist
0
sudar

Le programme tar a été mis en œuvre de différentes manières. Par exemple, sur la version d'Unix d'IBM, AIX , tar utilise l'option -L plutôt que -T et nécessite un fichier plutôt que de permettre à - d'indiquer stdin:

Usage: tar -{c|r|t|u|x} [ -BdDEFhilmopRUsvwZ ] [ -Number ] [ -f TarFil e ]
       [ -b Blocks ] [ -S [ Feet ] | [ Feet@Density ] | [ Blocksb ] ]
       [ -L InputList ] [-X ExcludeFile] [ -N Blocks ] [ -C Directory ] File ...
Usage: tar {c|r|t|u|x} [ bBdDEfFhilLXmNopRsSUvwZ[0-9] ] ]
       [ Blocks ] [ TarFile ] [ InputList ] [ ExcludeFile ]
       [ [ Feet ] | [ Feet@Density ] | [ Blocksb ] ] [-C Directory ] File ...
0
Scott Centoni