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
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
Antworten:
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:
ls
listet alle Dateien auf (zeilenweise, da das Ergebnis weitergeleitet wird).
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.
xargs -d"\n" rm
Führt rm line
einmal für jeden aus line
, der dazu geleitet wird.
Wo irre ich mich
Für den Anfang rm
nicht 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
, AA
etc. und sogar einen leeren String.
Weitere Informationen finden Sie unter Regular-Expressions.info .
-d"\n
Schalter behebt das Leerzeichenproblem.
grep -P
(Perl-Regex). grep -E
kann in diesem Fall funktionieren.
-I
mit xargs
nicht-tödlichen Befehlen zu arbeiten und sie immer zuerst zu testen:xargs -d"\n" -I {} echo "{}"
ls
? Siehe diese Frage, die auf diesen Artikel verweist . Wegen der Tücken können Sie, rm
was Sie nicht wollen.
Oder mit find
:
find your-directory/ -name 'A*[0-9][0-9]' -delete
Diese Lösung wird mit seltsamen Dateinamen umgehen .
-type f
xargs
Ansatz mit verwenden rm -f
.
Weitere Informationen finden Sie im Abschnitt zur Dateinamenerweiterung auf der bash-Manpage:
rm A*[0-9][0-9]
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.
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