Comment puis-je canaliser les informations dans tar
en spécifiant les noms du fichier?
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
.)
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 -
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é!
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
find /directory > filename
tar -T filename -cf archive.tar
Pour une meilleure compression, utiliser bzip2 peut être utile.
find $PWD -name "*.doc" > doc.filelist
tar -cvjf jumbo.tar.bz2 -T doc.filelist
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 ...