Wie lösche ich Dateien in der Kommandozeile mit regulären Ausdrücken?

18

Nehmen wir an, ich habe 20 Dateien mit dem Namen FOOXX, wobei XX die Nummer der Datei ist, z. B. 01, 02 usw.

Im Moment ist es einfach, wenn ich alle Dateien mit einer niedrigeren Nummer als 10 löschen möchte. Ich verwende nur einen Platzhalter, z. B. rm FOO0 *.

Wenn ich jedoch bestimmte Dateien in einem Bereich löschen möchte, z. B. 13-15, wird dies schwieriger.

rm FPP [13-15] funktioniert nicht und fragt mich, ob ich alle Dateien löschen möchte. Ebenso möchte rm FOO1 [3-5] alle Dateien löschen, die mit FOO1 beginnen

Was ist der beste Weg, um solche Dateibereiche zu löschen?

Ich habe es sowohl mit bash als auch mit zsh versucht, und ich denke nicht, dass sie sich für solch eine grundlegende Aufgabe so sehr unterscheiden?

Jack
quelle
"... rm FOO1 [3-5] möchte alle Dateien löschen, die mit FOO1 beginnen" Dies macht keinen Sinn und ist hier sicherlich nicht der Fall.
Ignacio Vazquez-Abrams
@Ignacio yeah- Ich würde gerne sehen, dass der Zeichensatz diese Sortierreihenfolge hat!
kmarsh

Antworten:

31

In bash können Sie verwenden:

rm FOO1 {3..5}

oder

rm FOO1 {3,4,5}

um FOO13, FOO14 und FOO15 zu löschen.

Bash Expansions Brace sind hier dokumentiert .

Mike Fitzpatrick
quelle
2
Oder sogar rm FOO{13..15}.
Ignacio Vazquez-Abrams
Gilt das auch für ZSH?
Jack
@ Jack: Ja, das ist es.
Bis auf weiteres angehalten.
@Jack: bashBefehle bilden eine Teilmenge der zShell-Befehle.
Abhinavkulkarni
Ich muss also sowohl die Regex- als auch die Globbing-Syntax lernen . Boohoo. :)
Aditya MP
13

Für zukünftige Leser kann der findBefehl auch Dateien löschen. Ich entschied mich für ein ähnliches Problem:

find . -type f -regex '...' -delete

Die gewählte Antwort ist jedoch die einfachste Antwort auf diese Frage.

GregWW
quelle
Die gewählte Antwort ist jedoch nur für Dateien geeignet, die einer Namenskonvention folgen. Dank Ihrer Antwort konnte ich einfach alle Objektdateien in einem Verzeichnis löschen. (in meinem Fall ging ich einfach mit find . -name "*.o" -deleteund es funktionierte wie ein Zauber)
John Hamilton
6

ls | grep regex | xargs rm

Gogiel
quelle
6
Verwenden Sie find -regex ... -print0 | xargs -0 ...dazu, sonst schlägt es bei Dateinamen mit Leerzeichen fehl.
Bis auf weiteres angehalten.
1
Wenn Sie verwenden möchten, können Sie natürlich findauch einfach verwenden -exec.
Ignacio Vazquez-Abrams
In meinem Fall hatten die Dateien Leerzeichen, und das Ändern des Trennzeichens behebt das Leerzeichenproblem: ls | grep regex | xargs --delimiter = '\ n' rm
Anake
1
-1 für den Versuch, ls
evilsoup
@evilsoup, +1 für das Hinzufügen dieser Warnung, aber wer fügt eine neue Zeile in einen Dateinamen ein?
Iulian Onofrei