Cómo comprimir una lista de archivos en Linux


17

Tengo muchos archivos que necesito comprimir en un solo directorio. No quiero comprimir todos los archivos en el directorio, pero solo los que coinciden con una determinada consulta.

yo hice

grep abc file-* > out.txt 

hacer un archivo con todas las instancias de "abc" en cada archivo. Necesito los archivos ellos mismos. ¿Cómo puedo decirle a bash que comprima solo esos archivos?


Los comodines no funcionan? ¿Por qué? Si puedo preguntar ...
jherran

@jherran No quiero comprimir todos los archivos en el directorio, solo los que coincidan con una consulta determinada. Hice grep abc file-* > out.txtun archivo con todas las instancias de "abc" en cada archivo. Necesito los archivos ellos mismos.
John Mangual

Lo que @jherran significa es zip ZipFile.zip file-*, que es la forma obvia de hacerlo. Necesitaría un archivo intermedio solo si estuviera utilizando un complejo findo una concatenación de listas de archivos de diferentes búsquedas.
AFH

Respuestas:


31

Muy simple:

zip archive -@ < out.txt

Es decir, si su out.txtarchivo contiene un nombre de archivo por línea. Agregará todos los archivos de out.txtun archivo llamado archive.zip.

La -@opción hace zipleer desde STDIN.

Si desea omitir la creación de un out.txtarchivo temporal , también puede usar grepla capacidad de imprimir nombres de archivo. -rhabilita la búsqueda recursiva (puede que no sea necesaria en su caso) e -limprime solo nombres de archivos:

grep -rl "abc" file-* | zip archive -@

Funciona bien, excepto que tengo un archivo de lista donde hay espacios en los nombres de archivo. Intenté escapar de ellos con `` y no escapar de ellos, una vez entre comillas y otra sin comillas alrededor del nombre del archivo (una línea, un nombre de archivo). Nada funcionó hasta ahora.
Thomas W.

2
Lo hice funcionar con espacios escapados `\` y sin comillas en el archivo y lo siguiente:cat out.txt | while read line ; do xargs zip archive.zip $line ; done
Thomas W.

si quieres zip archivos con nombres similares que podría intentarzip archive.zip $(ls common_name*)
chepe263

@ chepe263 Esto se rompe si los archivos tienen espacios en su camino. Generalmente se desaconseja analizar la salida de ls.
slhck

Para cualquier otra persona en una Mac que terminó aquí por cortesía de la indexación de motores de búsqueda, la -@sintaxis de la opción funciona bien a partir del 10.16, a pesar de que la página del manual todavía incluye lenguaje sobrenot on MacOS
Aidan Miles

0

Alternativas a la respuesta aceptada, desde aquí :

cat out.txt | zip -@ zipfile.zip
cat out.txt | zip -@ - > zipfile.zip
zip zipfile.zip $(cat out.txt) -r
zip zipfile.zip -r . -i@out.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.