h1

Dateioperationen mit der Bash

September 7, 2008

Die Bash eignet sich hervorragend für komplexere Dateioperationen, bei denen man Dateien nach einem bestimmten Muster löschen, verschieben oder ähnliches will.

Man will zum Beispiel aus folgendem Listing alle Dateien, die nicht auf .rar enden, löschen:

thomas@jane:~/test$ ls -lAh
insgesamt 17M
-rw-r–r– 1 thomas thomas 52M 2008-09-07 12:00 archiv.rar
-rwxr–r– 1 thomas thomas 678K 2008-09-07 12:02 DSCF0357.JPG
-rwxr–r– 1 thomas thomas 666K 2008-09-07 12:02 DSCF0358.JPG
-rwxr–r– 1 thomas thomas 722K 2008-09-07 12:02 DSCF0359.JPG
-rwxr–r– 1 thomas thomas 543K 2008-09-07 12:02 DSCF0360.JPG
-rwxr–r– 1 thomas thomas 928K 2008-09-07 12:02 DSCF0361.JPG
-rwxr–r– 1 thomas thomas 960K 2008-09-07 12:02 DSCF0362.JPG
-rwxr–r– 1 thomas thomas 981K 2008-09-07 12:02 DSCF0363.JPG
-rwxr–r– 1 thomas thomas 984K 2008-09-07 12:02 DSCF0364.JPG
-rwxr–r– 1 thomas thomas 918K 2008-09-07 12:02 DSCF0365.JPG
-rwxr–r– 1 thomas thomas 976K 2008-09-07 12:02 DSCF0366.JPG
-rwxr–r– 1 thomas thomas 795K 2008-09-07 12:02 DSCF0367.JPG
-rwxr–r– 1 thomas thomas 866K 2008-09-07 12:02 DSCF0368.JPG
-rwxr–r– 1 thomas thomas 929K 2008-09-07 12:02 DSCF0369.JPG
-rw-r–r– 1 thomas thomas 948K 2008-09-07 11:59 hallo.jpg
-rw-r–r– 1 thomas thomas 2K 2008-09-07 12:00 ilikethebash.sh
-rw-r–r– 1 thomas thomas 756K 2008-09-07 11:59 test.png
-rw-r–r– 1 thomas thomas 3085K 2008-09-07 11:59 test.rar
-rw-r–r– 1 thomas thomas 545 2008-09-07 11:59 test.txt

Man könnte jetzt alle Dateien die man löschen will per Hand eintippen, aber das wäre sehr viel unnötiger Zeitaufwand. Man könnte auch eine Sicherheitskopie der beiden Archive anlegen, dann alles löschen und die Kopien der Archive wieder in das Verzeichnis einfügen. Aber auch das ist noch längst nicht der schnellste Weg.

Der beste Weg, den ich gefunden habe, ist die Ausgabe von ls mithilfe einer Pipe (|) an grep zu übergeben, welches dann mithilfe von regulären Ausdrücken die richtigen Dateien rausfiltert. Damit letztendlich rm die Dateinamen als Argument übergeben werden kann, muss man die Ausgabe von grep an xargs weiterleiten, welches rm mit den Dateinamen als Argumente aufruft.

Der komplette Befehl sieht dann wie folgt aus:

thomas@jane:~/test$ ls | grep [^“.rar“]$ | xargs rm

Das Dach (^) am Anfang innerhalb der eckigen Klammern bei grep, negiert den Inhalt der Klammern. Das Dollarzeichen steht lediglich für das Ende der Zeile, so dass der Ausdruck auf alle Dateinamen passt die nicht auf .rar enden.

Wenn einem der Aufruf von xargs nicht passt, kann man den Befehl auch wie folgt abändern:

thomas@jane:~/test$ rm `ls | grep [^“.rar“]$`

Dabei wird erst der Befehl zwischen den Backticks (`) ausgewertet und an rm als Parameter übergeben.

One comment

  1. Hey, das wollte ich auch gerade loswerden =P
    Ziemlich hilfreich auf jeden Fall!



Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: