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 

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

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.


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 -

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)

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.