GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Holen Sie sich das Komplement des Ergebnisses eines Ls-Befehls?

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).


Linux
  1. Das Ergebnis von Ls * , Ls ** und Ls ***?

  2. Wie erhalte ich eine Anzahl von Dateien in einem Verzeichnis über die Befehlszeile?

  3. Was ist der Unterschied zwischen dem Abrufen der Befehlsausgabe mit "command" und $(command) in der Shell??

  4. Ein Befehl zum Abrufen des Synchronisierungsstatus einer Dropbox-Datei

  5. Öffnen Sie eine Datei, die durch das Ergebnis eines Befehls in vim angegeben wird

Lernen Sie Ihr System kennen (über die Befehlszeile)

Ansible Guide:Das Ad-hoc-Kommando

Der Linux-tar-Befehl erklärt

8 Möglichkeiten, Hilfe zur Linux-Shell zu erhalten

So erhalten Sie die Anzahl der Prozessoren / Kerne in Linux

Der Timer-Befehl in Linux