Rimuovi i file senza stringa nel nome


9

Voglio rimuovere i file che non hanno la stringa '999' (senza '') nel loro nome.

Ho provato:

grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --

Ma nessuno di loro funziona. Sto usando macOS Sierra, con bash: 3.2.57.


2
grep -linduce a elencare i file in cui è stata trovata (o non trovata una corrispondenza -v) nel contenuto , non il nome file. grepcorrisponde sempre al contenuto dei file specificati, mai ai loro nomi.
JoL

Risposte:


18

Utilizzando un modello di globbing esteso in bash:

rm ./!(*999*)

Questo richiede shopt -s extglobdi essere abilitato (e anche per sicurezza, in shopt -s failglobmodo 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' dotglobopzione.

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 zshshell equivalente al ciclo precedente sarebbe

rm ./(^(*999*))(.)

Il tuo primo comando non funzionerà poiché grepguarderà all'interno dei file. Rimuoverebbe tutti i file che hanno linee senza 999in loro (se hai aggiunto l' --nullopzione in modo che funzioni xargs -0).

Il tuo secondo comando non funzionerà poiché grepsu macOS non supporta --null-data(tuttavia ha --nullun'opzione, ma solo per la generazione dell'output del nome file). Si noti inoltre che cercherebbe in 999qualsiasi punto del percorso del file (compresi i componenti della directory), non solo il nome del file.


1
Vorresti anche abilitare l' failglobopzione o potrebbe finire per rimuovere il file chiamato !(*999*)se non ci sono altri file il cui nome non contiene 999.
Stéphane Chazelas,

16

Basta invertire la condizione del nome in find:

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

Aggiungi -deleteo -exec rm {} +per rimuovere effettivamente i file corrispondenti.


2
!è al sicuro dentro bash.
Kusalananda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.