Antworten:
Verwenden eines erweiterten Globbing-Musters in bash:
rm ./!(*999*)
Dies muss shopt -s extglobaktiviert 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 zshShell, die der obigen Schleife entspricht, wäre
rm ./(^(*999*))(.)
Ihr erster Befehl funktioniert nicht, da er grepin Dateien schaut. Es würde alle Dateien entfernen, die Zeilen ohne enthalten 999(hätten Sie die --nullOption hinzugefügt, damit es funktioniert xargs -0).
Ihr zweiter Befehl funktioniert nicht, da er grepunter macOS nicht unterstützt wird --null-data(es gibt jedoch eine --nullOption, jedoch nur zum Generieren der Dateinamenausgabe). Beachten Sie auch, dass 999im Pfad der Datei (einschließlich der Verzeichniskomponenten) nach einer beliebigen Stelle gesucht wird , nicht nur nach dem Namen der Datei.
failglobOption 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 -deleteoder -exec rm {} +Entfernen der übereinstimmenden Dateien.
!ist sicher in bash.
grep -lbewirkt, dass die Dateien aufgelistet werden, in denen eine Übereinstimmung-vim Inhalt gefunden wurde (oder nicht gefunden wurde ) , nicht der Dateiname.grepStimmt immer mit dem Inhalt der von Ihnen angegebenen Dateien überein, niemals mit deren Namen.