2010-04-08 18 views

Respuesta

80

Algo así como:

tar cfz foo.tgz -T - 

Pero tenga en cuenta que esto no funcionará para todos los nombres de archivo posibles; debe considerar la opción --null y alimentar tar desde find -print0. (El ejemplo xargs será bastante trabajo para las listas de archivos de gran tamaño, ya que se generan múltiples tar comandos.)

5

En lugar de utilizar la tubería se puede usar acentos abiertos, por ejemplo:

tar cvzf archive.tgz `ls -1 *` 

En lugar de ls -1 * se puede poner cualquier otro orden que la lista de los necesarios para archivar los archivos

produce
+10

Lo único es que esto no funcionará si la salida del comando ls es más larga que el tamaño máximo permitido de la línea de comando del shell. En tal caso, debe hacerlo como dice una de las otras respuestas; eso permite que la lista sea arbitrariamente larga. Además, "find [...] -print0" le permite crear un archivo tar que tenga miembros con caracteres especiales, mientras que el método ls no lo hace. Este método simplemente no es tan seguro ni universalmente aplicable. –

3
find /directory > filename 
tar -T filename -cf archive.tar 
20

Como ya se ha señalado por geekosaur, no hay necesidad de canalizar la salida de find a xargs porque es posible canalizar la salida de find directamente al tar usando find ... -print0 | tar --null ....

Tenga en cuenta las leves diferencias entre gnutar y bsdtar al excluir el archivo de 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 - 
+0

Si encuentra en el directorio actual, simplemente usar ../file.tar.gz como destino es lo suficientemente sólido. –

13

Extendiendo geekosaur answer:

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

Puede utilizar la entrada estándar con la opción -T.

Tenga en cuenta que si filtra archivos usando alguna condición (por ejemplo -name opción) en general que necesita para excluir directorios en la tubería, de lo contrario el alquitrán procesará todo su contenido, eso no es lo que desea. Por lo tanto, utilice:

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

Si no se utiliza -type, se sumarán todos los contenidos de directorios que coincidan con "mypattern"!

+0

Creo que este método es mejor que otros, ya que puede canalizar cualquier cosa que muestre a stdout – daks

+0

. Puede que desee considerar ser específico acerca de los tipos de archivos usando 'find'. Específicamente, haría 'find -type f'. Esto desvelará enlaces simbólicos, dispositivos de caracteres, etc. Si está interesado en directorios vacíos que 'find -type f -o -type d'. – JamesThomasMoon1979

0

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 
Cuestiones relacionadas