Ich möchte Dateien entfernen, deren Name nicht die Zeichenfolge '999' (ohne das '') enthält.
Ich habe versucht:
grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --
Aber keiner von ihnen funktioniert. Ich benutze macOS Sierra mit bash: 3.2.57.
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.Antworten:
Verwenden eines erweiterten Globbing-Musters in
bash
:Dies muss
shopt -s extglob
aktiviert sein (und aus Sicherheitsgründen auchshopt -s failglob
, damit keine Datei mit dem ungewöhnlichen Namen versehentlich!(*999*)
entfernt wird, wenn alle Dateinamen enthalten999
). 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 entfernendotglob
.So kümmern Sie sich nur um reguläre Dateien oder symbolische Links zu regulären Dateien (keine Verzeichnisse usw.):
Die
zsh
Shell, die der obigen Schleife entspricht, wäreIhr erster Befehl funktioniert nicht, da er
grep
in Dateien schaut. Es würde alle Dateien entfernen, die Zeilen ohne enthalten999
(hätten Sie die--null
Option hinzugefügt, damit es funktioniertxargs -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, dass999
im Pfad der Datei (einschließlich der Verzeichniskomponenten) nach einer beliebigen Stelle gesucht wird , nicht nur nach dem Namen der Datei.quelle
failglob
Option auch aktivieren, da sonst die aufgerufene Datei entfernt werden kann,!(*999*)
wenn keine andere Datei vorhanden ist, deren Name nicht enthält999
.Invertieren Sie einfach die Namensbedingung in
find
:Hinzufügen
-delete
oder-exec rm {} +
Entfernen der übereinstimmenden Dateien.quelle
!
ist sicher inbash
.