Wie kann ich rekursiv alle Dateien bzip2, die unter .bz2
Linux nicht mit der Erweiterung enden ?
Wie kann ich rekursiv alle Dateien bzip2, die unter .bz2
Linux nicht mit der Erweiterung enden ?
Antworten:
find ist dein Freund. Ich denke, das sollte es tun:
find <target_dir> -not -name \*.bz2 -exec bzip2 \{\} \;
dh wenn das Verzeichnis, in dem sich die Dateien befinden, die Sie bzipen möchten, / var / log / blah ist, wäre dies:
find /var/log/blah -not -name \*.bz2 -exec bzip2 \{\} \;
find /var/log/blah -not -name \*.bz2 -print0 | xargs -0 bzip2
Auf den ersten Blick (Entschuldigung, ich habe keine Shell zum Testen von Zitaten usw. zur Hand):
for _t in `find . -print |grep -v -E "\.bz$"`; do bzip2 -9 $_t && echo OK $_t || echo FAIL $_t; done
Dies verwendet find, um alle Dateien zu finden, grep, um diejenigen mit der Erweiterung .bz2 zu entfernen und sie dann einzeln in bzip2 einzuspeisen. Ich gehe jedoch davon aus, dass ein Teil des Zitats falsch ist - ich würde das Bit in den Backquotes zuerst separat testen.
Viel Glück! Vielleicht möchten Sie stattdessen xz verwenden - es wird normalerweise besser komprimiert - oder sogar alles tarieren und stattdessen bzip2 oder xz.
!
"nicht". Die Verwendung einer for
Schleife schlägt für Dateien fehl, deren Namen Leerzeichen enthalten. Sie sollten verwenden find | while read
.
Mit zsh ( setopt extended_glob
muss eingeschaltet sein):
bzip2 **/^*.bz2(.)
**
Rekursionen in Unterverzeichnissen; ^*.bz2
passt zu allem außer *.bz2
; (.)
beschränkt sich auf reguläre Dateien.
Wenn Sie mit Bash 4 die bzip2
Beschwerden über das Aufrufen von Verzeichnissen ignorieren können :
bzip2 **/!(*.bz2)
Hier ist ein Einzeiler. Falls erforderlich, ifne
zuerst installieren . Unter Ubuntu:
sudo apt-get install moreutils
Und dann:
find YOUR_DIR -type f -not -name \*.bz2 -print0 | ifne xargs -0 bzip2
Dies funktioniert genauso wie bei anderen Antworten, es werden jedoch keine Warnmeldungen zu bzip2ing-Verzeichnissen angezeigt. Wenn nichts bzip2
mehr zu tun ist, werden keine Warnmeldungen zu bzip2-komprimierten Daten an ein Terminal gesendet. Es verwendet auch xargs
etc.
YOUR_DIR kann Platzhalter oder mehrere Verzeichnisse haben, z. B. YOUR * DIR oder ähnliches.
In der fish
Konsole ist es ziemlich einfach und Sie müssen sich keine Gedanken über Rohre und seltsame Backslashes machen:
set files (find *)
for i in $files
bzip2 $i
end
+
oderxargs
statt\;
. Es ist nicht notwendig, den geschweiften Klammern zu entkommen. POSIX unterstützt!
"nicht".