Wenn Sie alle Dateien löschen möchten, deren Namen einer bestimmten Form entsprechen, ist ein Platzhalter (Glob-Muster) die einfachste Lösung. Einige Beispiele:
$ rm -f abc.log.* # Remove them all
$ rm -f abc.log.2012* # Remove all logs from 2012
$ rm -f abc.log.2012-0[123]* # Remove all files from the first quarter of 2012
Reguläre Ausdrücke sind mächtiger als Platzhalter; Sie können die Ausgabe von grep
füttern bis rm -f
. Wenn beispielsweise einige der Dateinamen mit "abc.log"
beginnen und einige mit "ABC.log"
, grep
ermöglicht eine Übereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung:
$ rm -f $(ls | grep -i '^abc\.log\.')
Dies führt zu Problemen, wenn einer der Dateinamen komische Zeichen enthält, einschließlich Leerzeichen. Seien Sie vorsichtig.
Dabei führe ich ls | grep ...
aus Befehl zuerst und prüfen Sie, ob er die gewünschte Ausgabe erzeugt -- insbesondere wenn ich rm -f
verwende :
$ ls | grep -i '^abc\.log\.'
(check that the list is correct)
$ rm -f $(!!)
wobei !!
wird zum vorherigen Befehl erweitert. Oder ich kann Pfeil nach oben oder Strg-P eingeben und die vorherige Zeile bearbeiten, um rm -f
hinzuzufügen Befehl.
Dies setzt voraus, dass Sie die Bash-Shell verwenden. Einige andere Shells, insbesondere csh und tcsh und einige ältere, von sh abgeleitete Shells, unterstützen möglicherweise nicht den $(...)
Syntax. Sie können die äquivalente Backtick-Syntax verwenden:
$ rm -f `ls | grep -i '^abc\.log\.'`
Die $(...)
Syntax ist einfacher zu lesen, und wenn Sie wirklich ehrgeizig sind, kann sie verschachtelt werden.
Wenn schließlich die Teilmenge der Dateien, die Sie löschen möchten, nicht einfach mit einem regulären Ausdruck ausgedrückt werden kann, besteht ein Trick, den ich häufig verwende, darin, die Dateien in einer temporären Textdatei aufzulisten und sie dann zu bearbeiten:
$ ls > list
$ vi list # Use your favorite text editor
Ich kann dann den list
bearbeiten Datei manuell, wobei nur die Dateien übrig bleiben, die ich entfernen möchte, und dann:
$ rm -f $(<list)
oder
$ rm -f `cat list`
(Auch dies setzt voraus, dass keiner der Dateinamen komische Zeichen enthält, insbesondere Leerzeichen.)
Oder beim Bearbeiten von list
Datei kann ich rm -f
hinzufügen an den Anfang jeder Zeile und dann:
$ . ./list
oder
$ source ./list
Das Bearbeiten der Datei ist auch eine Gelegenheit, bei Bedarf Anführungszeichen hinzuzufügen, z. B. das Ändern von rm -f foo bar
bis rm -f 'foo bar'
.
Verwenden Sie einfach die mehrzeilige Auswahl in Sublime, um alle Dateien in einer einzigen Zeile zusammenzufassen, und fügen Sie zwischen jedem Dateinamen ein Leerzeichen ein, und fügen Sie dann rm
hinzu am Anfang der Liste. Dies ist vor allem dann nützlich, wenn die Dateinamen, die Sie löschen möchten, kein Muster enthalten.
[$]> rm abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28 abc.log.2012-03-29 abc.log.2012-03-30 abc.log.2012-04-02 abc.log.2012-04-04 abc.log.2012-04-05 abc.log.2012-04-09 abc.log.2012-04-10
Bash unterstützt alle Arten von Platzhaltern und Erweiterungen.
Ihr genauer Fall würde wie folgt durch Klammererweiterung behandelt:
$ rm -rf abc.log.2012-03-{14,27,28}
Das obige würde erweitern zu ein einzelner Befehl mit allen drei Argumenten und entspricht der Eingabe von:
$ rm -rf abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28
Es ist wichtig zu beachten, dass diese Erweiterung von der Shell vor rm
durchgeführt wird wird sogar geladen.
Verwenden Sie einen Platzhalter (*
), um mehrere Dateien abzugleichen.
Der folgende Befehl löscht beispielsweise alle Dateien, deren Namen mit abc.log.2012-03-
beginnen .
rm -f abc.log.2012-03-*
Ich würde empfehlen, ls abc.log.2012-03-*
auszuführen um die Dateien aufzulisten, damit Sie sehen können, was Sie löschen werden, bevor Sie rm
ausführen Befehl.
Weitere Einzelheiten finden Sie auf der Bash-Manpage zur Dateinamenerweiterung.