Entfernen Sie Dateien ohne Zeichenfolge im Namen

9

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.

plr
quelle
2
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.
JoL

Antworten:

18

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.

Kusalananda
quelle
1
Sie möchten die failglobOption auch aktivieren, da sonst die aufgerufene Datei entfernt werden kann, !(*999*)wenn keine andere Datei vorhanden ist, deren Name nicht enthält 999.
Stéphane Chazelas
16

Invertieren Sie einfach die Namensbedingung in find:

find . -type f \! -name "*999*" 

Hinzufügen -deleteoder -exec rm {} +Entfernen der übereinstimmenden Dateien.

ilkkachu
quelle
2
!ist sicher in bash.
Kusalananda