Archivo de alquitrán que toma datos de una lista de archivos

166

Tengo un archivo que contiene una lista de archivos que quiero archivar con tar. Vamos a llamarlomylist.txt

Contiene:

file1.txt
file2.txt
...
file10.txt

¿Hay alguna manera de emitir el comando TAR que se toma mylist.txtcomo entrada? Algo como

tar -cvf allfiles.tar -[someoption?] mylist.txt

Para que sea similar a como si emitiera este comando:

tar -cvf allfiles.tar file1.txt file2.txt file10.txt 
Neversaint
fuente
44
La página de manual de tar es extremadamente inútil para esta opción (al menos en RedHat 5.4 a 6.3): "-T: obtener nombres para extraer o crear del archivo F". "Extraer o crear" suena como si se aplicara a sacar archivos del archivo tar, pero no a ponerlos. La -Xopción de exclusión sobrevive del antiguo comando tar de Unix, pero aparentemente -I (incluir) ¡no lo hice!
Ogre Psalm33
Hay pocas manpáginas con una EXAMPLESsección, a pesar de ser una sección estándar . Consulte < unix.stackexchange.com/questions/306189/… >.
sam boosalis

Respuestas:

262

Si:

tar -cvf allfiles.tar -T mylist.txt
Martin York
fuente
Me gustaría poder poner comentarios en mylist.txt ... ¿hay alguna solución usando alguna opción tar desde mylist.txt?
Stphane
77
@Stphane es simple, usar el indicador --exclude permite esto. Suponiendo que sus líneas de comentarios comiencen con un '#', un comando como el siguiente ignoraría / excluiría cualquier intento de operación de archivo en líneas que contienen cmments, es decir, su comando puede verse así: tar -cvf allfiles.tar --exclude = '^ # '-T mylist.txt. Tar informa de un error, pero cuando revisa su archivo tar, no hay errores y todos los archivos de la lista están dentro de su archivo.
Matt G
Señalando que este comando es para la variante de Linux y para aquellos en sunOS u otras variantes, consulte las otras respuestas a continuación. Por ejemplo, para sunOS, he probado dos alternativas: tar -cvf file.tar -I list.txt y tar -cvf file.tar $ (cat list.txt)
Nasri Najib
-L mylist.txten AIX
Roland
82

Suponiendo GNU tar (ya que esto es Linux), la opción -Tu --files-fromes lo que desea.

Simon Richter
fuente
3
Esta opción también existe en "bsdtar 3.1.2" en FreeBSD 10.
drue
33

También puede canalizar los nombres de archivo que pueden ser útiles:

find /path/to/files -name \*.txt | tar -cvf allfiles.tar -T -
woot
fuente
2
¿Qué pasa si la lista de archivos .txt es realmente enorme? ¿Se debe usar el comando xarg con tar -r .. en lugar de tar -c ..?
Stphane
1
@Stphane Hmm, no creo que la longitud de la lista importe mucho para este método. De hecho, me imagino que este método es mejor que xargs ya que xargs volverá a ejecutar tar una y otra vez para agregar datos, pero realmente no he probado los métodos uno al lado del otro.
woot
2
Cuando se emplea una tubería, que es el caso aquí, el sistema operativo crea flujos en ambos lados de la tubería y sincroniza la producción y el consumo de datos. La lista de archivos podría ser infinita. Podrías tar / gz en todo Internet usando una Raspberry Pi Zero, dado que tienes suficiente almacenamiento en el extremo de la tubería.
Richard Gomes
14

Algunas versiones de tar, por ejemplo, las versiones predeterminadas en HP-UX (probé 11.11 y 11.31), no incluyen una opción de línea de comando para especificar una lista de archivos, por lo que una solución decente es hacer esto:

tar cvf allfiles.tar $(cat mylist.txt)
barush
fuente
44
UUoC (uso innecesario de cat), simplemente $(<mylist.txt).
David C. Rankin
2
tenga en cuenta que esto puede exceder la longitud máxima de la línea de comando si mylist.txtes grande
Andre Holzner
en ese caso tar -T <(<mylist.txt). redundante como esta respuesta.
Mike D
7

En Solaris, puede usar la opción -I para leer los nombres de archivo que normalmente indicaría en la línea de comando desde un archivo. A diferencia de la línea de comando, esto puede crear archivos tar con cientos de miles de archivos (solo eso).

Entonces el ejemplo leería

tar -cvf allfiles.tar -I mylist.txt
ene
fuente
3

Para mí en AIX, funcionó de la siguiente manera:

tar -L List.txt -cvf BKP.tar
Cassiano Bucci
fuente