Nehmen wir an, ich habe ein Verzeichnis mit mehreren Dateien, die alle entweder Binärdateien (Dateien ohne deklarierte Erweiterungen) und Quelldateien (.c
Verlängerung). Ich mache das:
$ ls
und erhalten:
README.md hello-world.c hello-world get-name.c get-name
und ich möchte nur Dateien mit bestimmten Erweiterungen auflisten (z. B. .c
und .md
), ich tue:
ls *.c *.md
und das ist ok!
Aber was ist, wenn ich jetzt alle Dateien löschen möchte, die nicht haben eine .c
oder .md
Erweiterung, wie kann ich das tun?
Ich weiß, wie man das mit Dateien macht, deren Erweiterungen mir bekannt sind, wie:
ls *.c *.md | xargs rm
Aber wie sage ich der Befehlszeile, dass sie die Dateien löschen soll, die NICHT meinen Kriterien entsprechen?
Akzeptierte Antwort:
Verwenden Sie find
:
find -maxdepth 1 ! -name "*.c" -print0 | xargs -0 ...
Beachten Sie, dass -maxdepth
, -print0
, -r
und -0
finden sich in ein paar find
Implementierungen (wurden von GNU find
eingeführt /xargs
), werden aber nicht von POSIX angegeben. Ein anderer Weg ist, wie Stéphane in seinem Kommentar erwähnt hat, die Verwendung von -exec
Aktion von find – denken Sie daran, den -exec command {} +
zu verwenden Form, da es die Anzahl der Aufrufe von command
drastisch reduziert (Es muss jedoch eine Syntax zulassen, bei der die Dateinamen am Ende stehen, oder Sie müssen den command
umbrechen innerhalb eines sh -c
anrufen).
Alternativ grep
die Ausgabe von ls
ls | grep -v ".c$" | xargs ...
Sie können mehrere Erweiterungen entweder mit regulären Ausdrücken filtern:
... | grep -v ".(c|md)$" | ...
mit erweiterten regulären Ausdrücken:
... | grep -Ev ".(c|md)$" | ...
mit fester Zeichenfolgenoption (passt nicht nur am Ende des Dateinamens!):
... | grep -vF ".c
.md" | ...
oder indem Sie weitere grep
verketten s:
... | grep -v ".c$" | grep -v ".md$" | ...
Das heißt, find
ist wahrscheinlich die beste Option, da mit dem -print0
Option verarbeitet sie alle möglichen Zeichen in Dateinamen, die andernfalls maskiert werden müssten (vorausgesetzt, Ihre find
und xargs
können mit NULL-terminierten Strings arbeiten – z.B. die GNU-Tools sind).