Löschen Sie Dateien mit regulären Ausdrücken

40

Ich habe versucht, Dateien zu löschen, die mit A beginnen und mit 2 Ziffern enden, aber das macht nichts.
Was ich versucht habe:

rm ^A*[0..9]2$

Wo irre ich mich

gdoron unterstützt monica
quelle

Antworten:

56

Mit dem folgenden Befehl können Sie alle Dateien löschen, die Ihren Kriterien entsprechen:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm

Wie es funktioniert:

  1. ls listet alle Dateien auf (zeilenweise, da das Ergebnis weitergeleitet wird).

  2. grep -P "^A.*[0-9]{2}$" filtert die Liste der Dateien und lässt nur diejenigen übrig, die dem regulären Ausdruck entsprechen ^A.*[0-9]{2}$

    • .*Gibt eine beliebige Anzahl von Vorkommen von an ., wobei .ein Platzhalter für ein beliebiges Zeichen steht.

    • [0-9]{2}gibt genau zwei Vorkommen an [0-9], dh eine beliebige Ziffer.

  3. xargs -d"\n" rmFührt rm lineeinmal für jeden aus line, der dazu geleitet wird.

Wo irre ich mich

Für den Anfang rmnicht einen regulären Ausdruck als Argument akzeptieren. Neben dem Platzhalter *wird jedes andere Zeichen buchstäblich behandelt.

Außerdem ist Ihr regulärer Ausdruck geringfügig deaktiviert. Zum Beispiel *bedeutet alle Vorkommen von ...in einem regulären Ausdruck, so A*Streichhölzer A, AAetc. und sogar einen leeren String.

Weitere Informationen finden Sie unter Regular-Expressions.info .

Dennis
quelle
3
Achten Sie auf Leerzeichen in Dateinamen.
Slhck
1
Der -d"\nSchalter behebt das Leerzeichenproblem.
Fr.
1
Hinweis - Einige Distributionen (wie Mac OS) haben kein grep -P(Perl-Regex). grep -Ekann in diesem Fall funktionieren.
Bluescrubbie
1
Ich bevorzuge es, -Imit xargsnicht-tödlichen Befehlen zu arbeiten und sie immer zuerst zu testen:xargs -d"\n" -I {} echo "{}"
jozxyqk
1
Analysieren ls? Siehe diese Frage, die auf diesen Artikel verweist . Wegen der Tücken können Sie, rmwas Sie nicht wollen.
Kamil Maciorowski
45

Oder mit find:

find your-directory/ -name 'A*[0-9][0-9]' -delete

Diese Lösung wird mit seltsamen Dateinamen umgehen .

cYrus
quelle
4
Dies ist eine großartige Lösung. Ich bevorzuge es, weil es einfacher ist und Sie das Flag -delete am Ende weglassen können, um zu prüfen, ob Ihre Regex korrekt ist, bevor Sie Ihre Dateien massenweise löschen.
JAMESSTONEco
1
Darüber hinaus haben Sie mehr Kontrolle über das, was Sie löschen, zum Beispiel das Hinzufügen von-type f
Marco Sulla
Kann dies zum Löschen von Dateien und Ordnern verwendet werden? Es funktioniert nicht für nicht leere Ordner.
Alex
@Alex Nein, das Verzeichnis muss leer sein (es war sowieso keine OP-Anforderung), Sie können den xargsAnsatz mit verwenden rm -f.
CYRUS
10

Weitere Informationen finden Sie im Abschnitt zur Dateinamenerweiterung auf der bash-Manpage:

rm A*[0-9][0-9]
Glenn Jackman
quelle
funktionierte gut für mich.
Nishanth Matha
Dies war die einfachste und vollständigste Antwort auf die Frage.
Janac Meena
Funktioniert dies, wenn der Ordner viele Dateien enthält?
Itay
1

Die Lösung mit regexp ist 200-mal besser, auch wenn Sie sehen können, welche Datei gelöscht wird, bevor Sie den Befehl verwenden und die letzte Pipe abschneiden:

ls | grep -P "^A.*[0-9]{2}$"

Dann, wenn es richtig ist, verwenden Sie einfach:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm

Das ist 200 Mal besser, denn wenn Sie mit Unix arbeiten, ist es wichtig zu wissen, wie man grep benutzt. Es ist sehr mächtig, wenn Sie wissen, wie man es benutzt.

Salvatore
quelle
1
Dies scheint nicht viel mehr hinzuzufügen, als Dennis '4 Jahre alte Antwort bereits sagt.
8bittree
1
"200 mal" ist eine ziemlich spezifische. Viele andere Befehle sind ebenfalls sehr mächtig. Sie müssen nur lernen, wie man sie verwendet.
Glenn Jackman
1

Das funktioniert auf meinem Mac:

rm $(ls | grep -e '^A*[0..9]2$')

Strahl
quelle
0

find Befehl funktioniert auch mit regulären Ausdrücken.

Überprüfen Sie, welche Dateien gelöscht werden sollen

find . -regex '^A.*[0-9]{2}$'

Dateien löschen

find . -regex '^A.*[0-9]{2}$' -delete
Petr Javorik
quelle