Antworten:
Verwenden eines erweiterten Globbing-Musters in bash
:
rm ./!(*999*)
Dies muss shopt -s extglob
aktiviert sein (und aus Sicherheitsgründen auch shopt -s failglob
, damit keine Datei mit dem ungewöhnlichen Namen versehentlich !(*999*)
entfernt wird, wenn alle Dateinamen enthalten 999
). Das Muster !(*999*)
stimmt mit jedem Namen im aktuellen Verzeichnis überein, mit Ausnahme der Namen, die übereinstimmen *999*
. Aktivieren Sie auch die Option, um versteckte Dateien (Dateien, deren Name mit einem Punkt beginnt ) zu entfernen dotglob
.
So kümmern Sie sich nur um reguläre Dateien oder symbolische Links zu regulären Dateien (keine Verzeichnisse usw.):
for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done
Die zsh
Shell, die der obigen Schleife entspricht, wäre
rm ./(^(*999*))(.)
Ihr erster Befehl funktioniert nicht, da er grep
in Dateien schaut. Es würde alle Dateien entfernen, die Zeilen ohne enthalten 999
(hätten Sie die --null
Option hinzugefügt, damit es funktioniert xargs -0
).
Ihr zweiter Befehl funktioniert nicht, da er grep
unter macOS nicht unterstützt wird --null-data
(es gibt jedoch eine --null
Option, jedoch nur zum Generieren der Dateinamenausgabe). Beachten Sie auch, dass 999
im Pfad der Datei (einschließlich der Verzeichniskomponenten) nach einer beliebigen Stelle gesucht wird , nicht nur nach dem Namen der Datei.
failglob
Option auch aktivieren, da sonst die aufgerufene Datei entfernt werden kann, !(*999*)
wenn keine andere Datei vorhanden ist, deren Name nicht enthält 999
.
Invertieren Sie einfach die Namensbedingung in find
:
find . -type f \! -name "*999*"
Hinzufügen -delete
oder -exec rm {} +
Entfernen der übereinstimmenden Dateien.
!
ist sicher in bash
.
grep -l
bewirkt, dass die Dateien aufgelistet werden, in denen eine Übereinstimmung-v
im Inhalt gefunden wurde (oder nicht gefunden wurde ) , nicht der Dateiname.grep
Stimmt immer mit dem Inhalt der von Ihnen angegebenen Dateien überein, niemals mit deren Namen.