Utilizzare gzip per comprimere i file in una directory ad eccezione dei file .gz già esistenti


19

Ho una directory di log che vorrei impostare un lavoro da comprimere usando gzip . Il problema è che non voglio ricomprimere i registri che ho già compresso.

Ho provato a usare ls | grep -v gz | gzip, ma non sembra funzionare.

C'è un modo per fare questo? Fondamentalmente voglio gzip ogni file nella directory che non termina in .gz.

Risposte:


26

Puoi semplicemente fare:

gzip *

gzip ti dirà che salta i file che hanno già un .gz finale.
Se quel messaggio si intromette, puoi usare:

gzip -q *

Quello che hai provato non ha funzionato, perché gzipnon legge i nomi dei file dei file da comprimere da stdin, per farlo funzionare dovresti usare:

ls | grep -v gz | xargs gzip

Escluderai i file con lo schema gzovunque nel nome del file, non solo alla fine.¹ Devi anche tenere presente che l'analisi dell'output di lsè pericolosa quando hai nomi di file con spazi, newline, ecc., Sono coinvolti.

Una soluzione più pulita, non basandosi sul gzipsalto di file con un .gzfinale è, che gestisce anche i file non compressi nelle sottodirectory:

find .  -type f ! -name "*.gz" -exec gzip {} \;



¹ Come izkatacommentato: usare .gzda solo per migliorare questo, non funzionerebbe. Dovresti usare grep -vF .gzo grep -v '\.gz$'. Ciò lascia ancora il pericolo di elaborare lsl'output


1
"... questo rende meno probabile la corrispondenza con una parte interna di un nome di file" - è grep, basta usare $quindi è più chiaro. E non sei sfuggito .comunque, quindi escluderà solo i file che iniziano con gz(poiché non hanno "nessun personaggio prima gz")
Izkata,

1
@Izkata: No, incluso il punto senza caratteri di escape e non ancorare la regex con $l'esclusione ( -v) di tutti i file con nomi composti da tre o più caratteri incluso qualsiasi carattere seguito da "gz" in qualsiasi punto del nome file. Quindi includerà i file con nomi che iniziano con "gz".
In pausa fino a nuovo avviso.

1
@DennisWilliamson Il mio ultimo commento non è stato chiaro, escluderà anche i file con gzqualsiasi posizione nel nome (tranne l'inizio). Quindi è meglio ancorarlo comunque. Non avendo usato $, sembrava che non ti rendessi conto di cosa .significhi in una regex, quindi il resto del commento confuso.
Izkata,
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.