find . -type f | \
while read -r x
do
gzip -c "$x" > "$x.gz"
done
-c
posune výsledek na stdout a ponechá originál sám. Nevýhodou je, že si soubory musíte najít sami. Pro sofistikovanější procházení můžete použít find(1)
, nicméně jako výše:.
prohledává od aktuálního adresáře a -type f
vrátí název každého běžného souboru.
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;
Můžete to snadno přepnout a zahrnout to, co chcete komprimovat ( -name '*.txt -or -name '*.html
atd.) místo jako nyní, s výjimkou některých souborů (již komprimovaných, záložních a dočasných souborů).
Dobře si poradí i s mezerami v názvu souboru.
Změňte gzip
na echo gzip
pro testování. Nebo přeskočte část -exec dohromady.
Upravit: Oh, zapomněl jsem zmínit, že to nekontroluje, zda <target>.gz
již existuje. To může, ale nemusí být problém.
Úprava2: Dobře, tady je něco, co kontroluje existující soubor. Pokud je to možné. Omlouvám se za jednotvárnost.
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 '*[~#]' \))
Můj find
-foo možná není to, co by mohlo být, může být velmi dobře možné přeskočit přímo v find.
gzip -k
možnost
gzip 1.6 (červen 2013) přidal -k, --keep
možnost, takže nyní můžete:
gzip -kr .
a nesmaže vaše původní soubory.
Nalezeno na:https://unix.stackexchange.com/questions/46786/how-to-tell-gzip-to-keep-original-file