tag run remove hub from container tar

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