¿Cómo puedo canalizar información a tar
especificando los nombres del archivo?¿Cómo puedo construir un archivo tar desde stdin?
Respuesta
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.)
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
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. –
find /directory > filename
tar -T filename -cf archive.tar
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 -
Si encuentra en el directorio actual, simplemente usar ../file.tar.gz como destino es lo suficientemente sólido. –
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"
!
Creo que este método es mejor que otros, ya que puede canalizar cualquier cosa que muestre a stdout – daks
. 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
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
- 1. ¿Cómo extraer el archivo tar desde stdin?
- 2. Leer desde archivo, o STDIN
- 3. ¿Cómo puedo construir estáticamente GDB desde la fuente?
- 4. Android: construir un archivo desde un android.net.URI
- 5. Autotools - tar Esto no se ve como un archivo tar
- 6. Cómo analizar un archivo tar en C++
- 7. Cómo crear archivo tar plana
- 8. ¿Cómo extraigo un archivo tar en Java?
- 9. ¿Cómo puedo validar un archivo de video desde un script?
- 10. Cómo construir src desde un CygPort?
- 11. Actualización de un único archivo en un archivo comprimido tar
- 12. HP-UX - ¿Cómo puedo leer un archivo de texto del archivo tar sin extraerlo?
- 13. ¿Cómo crear un archivo tar completamente comprimido usando Python?
- 14. ¿Cómo construir una DataTable desde un DataGridView?
- 15. ¿Cómo puedo procesar un archivo tar con un grupo de multiprocesamiento de Python?
- 16. Escribiendo a stdin desde PHP?
- 17. Cómo descomprimir un archivo TAR utilizando Apache Commons
- 18. ¿Cómo puedo construir un Truth Table Generator?
- 19. ¿Cómo leer desde stdin con fgets()?
- 20. Leer programáticamente desde STDIN o archivo de entrada en Perl
- 21. ¿Cómo puedo generar XML desde XMLBuilder usando un archivo .xml.builder?
- 22. ¿Cómo puedo servir un archivo JavaScript dinámico desde Wicket?
- 23. OpenSSL crear hash SHA desde shell stdin
- 24. Crear archivo tar sin estructura de carpeta
- 25. ¿Puede javac compilar desde stdin?
- 26. ¿Cómo pasar argumentos y redirigir stdin desde un archivo a la ejecución del programa en gdb?
- 27. Capistrano gzip: stdin: interrupción inesperada al final del archivo
- 28. Descomprime el archivo tar en el directorio
- 29. Cómo construir un SplashScreen desde un archivo de imagen cargado, no un recurso de proyecto
- 30. ¿Cómo quitar una copia de un identificador de archivo STDIN?
Creo que @geekosaur debe marcarse porque es la respuesta que mejor coincide con la pregunta. –
He cambiado la respuesta seleccionada, tienes razón. –