Vor kurzem stand ich vor der Aufgabe, alle Dateien / Ordner in einem Verzeichnis zu löschen, mit Ausnahme derjenigen, die einem bestimmten Muster entsprechen. Also habe ich mir einen einzeiligen Unix-Befehl ausgedacht, um die Arbeit zu erledigen. Muss es nur eine Zeile sein? Ich nehme nicht an, aber so ist es definitiv cooler!
Obwohl das Problem ziemlich einfach ist, war ich ein wenig überrascht, wie komplex meine Lösung war. Hier ist der Befehl, den ich verwendet habe; HINWEIS: Dies ist eine schlechte Lösung, da keine Dateinamen mit Zeilenvorschubzeichen verarbeitet werden (was in meiner Situation keine Rolle spielte).
ls | grep -v PATTERN | xargs -n1 -IREPLACE rm -rf REPLACE
Ich habe den Befehl "find" nicht verwendet, da ich nicht in Ordner zurückkehren möchte, die mit PATTERN übereinstimmen. Betrachten Sie beispielsweise die folgende Dateistruktur:
file_foo.txt
first_dir
|
+--> contents
+--> ...
foo_dir
|
+--> anotherfile.txt
+--> morefiles.log
foo_file.txt
somefile.txt
Bei Verwendung des Musters "foo" dürfen nur "first_dir" (und natürlich der Inhalt) und "somefile.txt" ( nicht "anotherfile.txt" oder "morefiles.log") entfernt werden.
Frage: Gibt es bessere (elegantere und korrektere) Möglichkeiten, dies zu erreichen?
EDIT:
Ich wurde kürzlich darauf aufmerksam gemacht, dass "Finden" eine bessere Option sein kann:
find * -maxdepth 0 ! -name PATTERN -print0 | xargs -0n1 rm -rf
Diese Lösung behandelt Pfade mit Zeilenvorschubzeichen korrekt.