Come comprimere un elenco di file in Linux


17

Ho molti file che devo comprimere in una singola directory. Non voglio comprimere tutti i file nella directory, ma solo quelli che corrispondono a una determinata query.

L'ho fatto

grep abc file-* > out.txt 

per creare un file con tutte le istanze di "abc" in ciascun file. Ho bisogno dei file stessi. Come posso dire a bash di comprimere solo quei file?


I caratteri jolly non funzionano? Perché? Se posso chiedere ...
jherran

@jherran Non voglio comprimere tutti i file nella directory, solo quelli che corrispondono a una determinata query. Ho fatto grep abc file-* > out.txtper creare un file con tutte le istanze di "abc" in ciascun file. Ho bisogno dei file stessi.
john mangual,

Cosa significa @jherran è zip ZipFile.zip file-*, che è il modo ovvio per farlo. Avresti bisogno di un file intermedio solo se stavi utilizzando una complessa findo una concatenazione di elenchi di file da ricerche diverse.
AFH,

Risposte:


31

Molto semplice:

zip archive -@ < out.txt

Cioè, se il tuo out.txtfile contiene un nome file per riga. Aggiungerà tutti i file da out.txtun archivio chiamato archive.zip.

L' -@opzione viene zipletta da STDIN.

Se vuoi saltare la creazione di un out.txtfile temporaneo , puoi usare anche grepla capacità di stampare nomi di file. -rabilita la ricerca ricorsiva (potrebbe non essere necessaria nel tuo caso) e -lstampa solo i nomi dei file:

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

Funziona bene, tranne che ho un file di elenco in cui ci sono spazi nei nomi dei file. Ho provato sia a sfuggirli con `` che a non sfuggirli, una volta tra virgolette e una volta senza virgolette attorno al nome del file (una riga - un nome file). Niente ha funzionato finora.
Thomas W.

2
L'ho fatto funzionare con `\` spazi di escape e senza virgolette nel file e quanto segue:cat out.txt | while read line ; do xargs zip archive.zip $line ; done
Thomas W.

se vuoi comprimere file con nomi simili puoi provarezip archive.zip $(ls common_name*)
chepe263,

@ chepe263 Questo si interrompe se i file hanno spazi nel loro percorso. È generalmente sconsigliato analizzare l'output.
Slhck,

Per chiunque altro su un mac che è finito qui per gentile concessione dell'indicizzazione dei motori di ricerca, la -@sintassi dell'opzione funziona bene a partire da 10.16, anche se la pagina man include ancora la lingua circanot on MacOS
Aidan Miles

0

Alternative alla risposta accettata, da qui :

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.