find . -type f | \
while read -r x
do
gzip -c "$x" > "$x.gz"
done
Il -c
spinge il risultato su stdout e mantiene solo l'originale. Lo svantaggio è che devi trovare tu stesso i file. Per un attraversamento più sofisticato, puoi usare find(1)
, tuttavia, come sopra:.
ricerche a partire dalla directory corrente e -type f
restituisce il nome di ogni file regolare.
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;
Puoi facilmente cambiarlo per includere ciò che vuoi comprimere ( -name '*.txt -or -name '*.html
ecc.) invece di come adesso, escludendo alcuni file (file già compressi, di backup e temporanei).
Gestisce bene anche gli spazi nel nome del file.
Cambia gzip
a echo gzip
per il test. Oppure salta tutta la parte -exec.
Modifica: Oh, ho dimenticato di dire che questo non controlla se <target>.gz
esiste già. Questo può o non può essere un problema.
Modifica2: Ok, qui andiamo con qualcosa che controlla il file esistente. Se questo può essere voluto. Scusate l'unicità.
while read file; do if [ ! -f "$file.gz" ]; then echo "Compressing $file"; gzip -c "$file" > "$file.gz"; else echo "Not overwriting $file.gz"; fi done < <(find . -type f -not \( -name '*.gz' -or -name '*[~#]' \))
Il mio find
-foo forse non è quello che potrebbe essere, potrebbe benissimo essere possibile saltare direttamente in find.
gzip -k
opzione
gzip 1.6 (giugno 2013) ha aggiunto -k, --keep
opzione, quindi ora puoi:
gzip -kr .
e non eliminerà i tuoi file originali.
Trovato su:https://unix.stackexchange.com/questions/46786/how-to-tell-gzip-to-keep-original-file