Risposte:
Utilizzando un modello di globbing esteso in bash
:
rm ./!(*999*)
Questo richiede shopt -s extglob
di essere abilitato (e anche per sicurezza, in shopt -s failglob
modo che nessun file con il nome insolito !(*999*)
venga rimosso per errore se tutti i nomi dei file contengono 999
). Il modello !(*999*)
corrisponderà a qualsiasi nome nella directory corrente, tranne quei nomi corrispondenti *999*
. Per rimuovere anche i file nascosti (file il cui nome inizia con un punto ), abilitare anche l' dotglob
opzione.
Per preoccuparsi solo di file regolari o collegamenti simbolici a file regolari (non directory ecc.):
for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done
La zsh
shell equivalente al ciclo precedente sarebbe
rm ./(^(*999*))(.)
Il tuo primo comando non funzionerà poiché grep
guarderà all'interno dei file. Rimuoverebbe tutti i file che hanno linee senza 999
in loro (se hai aggiunto l' --null
opzione in modo che funzioni xargs -0
).
Il tuo secondo comando non funzionerà poiché grep
su macOS non supporta --null-data
(tuttavia ha --null
un'opzione, ma solo per la generazione dell'output del nome file). Si noti inoltre che cercherebbe in 999
qualsiasi punto del percorso del file (compresi i componenti della directory), non solo il nome del file.
failglob
opzione o potrebbe finire per rimuovere il file chiamato !(*999*)
se non ci sono altri file il cui nome non contiene 999
.
Basta invertire la condizione del nome in find
:
find . -type f \! -name "*999*"
Aggiungi -delete
o -exec rm {} +
per rimuovere effettivamente i file corrispondenti.
!
è al sicuro dentro bash
.
grep -l
induce a elencare i file in cui è stata trovata (o non trovata una corrispondenza-v
) nel contenuto , non il nome file.grep
corrisponde sempre al contenuto dei file specificati, mai ai loro nomi.