find . -type f | \
while read -r x
do
gzip -c "$x" > "$x.gz"
done
Der -c
verschiebt das Ergebnis nach stdout und behält das Original allein. Der Nachteil ist, dass Sie die Dateien selbst finden müssen. Für anspruchsvolleres Traversieren können Sie find(1)
verwenden , jedoch wie oben:.
sucht ab dem aktuellen Verzeichnis und -type f
gibt den Namen jeder regulären Datei zurück.
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;
Sie können es leicht umstellen, um das einzuschließen, was Sie komprimieren möchten ( -name '*.txt -or -name '*.html
usw.) statt wie jetzt, mit Ausnahme einiger Dateien (bereits komprimierte, Sicherungs- und temporäre Dateien).
Behandelt auch Leerzeichen im Dateinamen problemlos.
Ändern Sie gzip
bis echo gzip
zum Prüfen. Oder überspringen Sie den Teil -exec ganz.
Bearbeiten: Oh, ich habe vergessen zu erwähnen, dass dies nicht prüft, ob <target>.gz
ist bereits vorhanden. Dies kann ein Problem sein oder auch nicht.
Edit2: Ok, hier kommen wir zu etwas, das nach vorhandenen Dateien sucht. Falls das gewollt sein darf. Verzeihen Sie die Einseitigkeit.
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 '*[~#]' \))
Mein find
-foo ist vielleicht nicht das, was es sein könnte, es kann durchaus möglich sein, direkt in find zu springen.
gzip -k
Möglichkeit
gzip 1.6 (Juni 2013) hat den -k, --keep
hinzugefügt Option, also können Sie jetzt:
gzip -kr .
und Ihre Originaldateien werden nicht gelöscht.
Gefunden unter:https://unix.stackexchange.com/questions/46786/how-to-tell-gzip-to-keep-original-file