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