run - ¿Cómo puedo construir un archivo tar desde stdin?
docker run image (7)
¿Cómo puedo canalizar información en tar
especificando los nombres del archivo?
Algo como:
tar cfz foo.tgz -T -
Pero tenga en cuenta que esto no funcionará para todos los nombres de archivo posibles; deberías considerar la opción --null
y feed tar
de find -print0
. (El ejemplo de xargs
no funcionará para las listas de archivos de gran tamaño porque generará varios comandos tar
).
Como ya señaló geekosaur, no hay necesidad de canalizar la salida de find
a xargs
porque es posible canalizar la salida de find
directamente a tar
utilizando find ... -print0 | tar --null ...
find ... -print0 | tar --null ...
Sin bsdtar
en cuenta las leves diferencias entre gnutar
y bsdtar
al excluir el archivo.
# 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 -
El programa tar
ha sido implementado de varias formas. Por ejemplo, en la versión de IBM de Unix, AIX , tar
utiliza la opción -L
lugar de -T
, y requiere un archivo en lugar de permitirlo -
para indicar 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 ...
En lugar de usar una tubería, podrías usar palos, por ejemplo:
tar cvzf archive.tgz `ls -1 *`
En lugar de ls -1 *
puede poner cualquier otro comando que produzca la lista de archivos necesarios para archivar
Extendiendo la respuesta geekosaur :
find /directory | tar -cf archive.tar -T -
Puede usar stdin con la opción -T
.
Tenga en cuenta que si filtra archivos usando alguna condición (por ejemplo, la opción -name
), en general, debe excluir directorios en la tubería, de lo contrario, tar procesará todo su contenido, que no es lo que desea. Entonces, usa:
find /directory -type f -name "mypattern" | tar -cf archive.tar -T -
Si no usa -type
, ¡se agregará todo el contenido de los directorios que coincidan con "mypattern"
!
Para una mejor compresión, usar bzip2 podría ser útil.
find $PWD -name "*.doc" > doc.filelist
tar -cvjf jumbo.tar.bz2 -T doc.filelist
find /directory > filename
tar -T filename -cf archive.tar