2015-08-03 24 views
8
grep -n magenta *| rm * 

grep: a.txt: No such file or directoryCome rimuovere i file usando grep e rm?

grep: b: No such file or directory

Soprattutto comando rimuove tutti i file presenti nella directory eccezione, .... Dovrebbe rimuovere solo quei file che contengono la parola "magenta"

Inoltre, provato grep magenta * -exec rm '{}' \; ma senza fortuna. Qualche idea?

+0

Un duplicato di molte altre domande. La parte chiave della risposta è solitamente 'xargs'. Le campane e i fischietti variano. L'opzione '-n' è controproducente; di fatto, probabilmente si preferisce '-l'. –

+1

dovrebbe notare che '-exec' è solo l'argomento strano di' find'. 'grep' non ha quella merda: D – armnotstrong

risposta

12

Uso xargs:

grep -l --null magenta ./* | xargs -0 rm 

Lo scopo è quello di prendere xargs ingresso stdin e posizionarlo sulla linea di comando del suo argomento.

Quali opzioni fare:

  • L'opzione -l dice a grep di non stampare il testo corrispondente e invece basta stampare i nomi dei file che contengono testo corrispondente.

  • L'opzione --null dice a grep di separare i nomi di file con caratteri NUL. Ciò consente di gestire in modo sicuro tutte le maniere del nome file.

  • L'opzione -0 su xargs per trattare il suo input come NUL-separato.

+1

Nota che l'opzione' -Z' è non standard - è supportata da GNU 'grep'; per esempio, non è supportato su Mac OS X. O, più precisamente, su Mac OS X, le opzioni '-z' e' -Z' significano 'decompressa' e '--null' stampa null dopo il nome del file.Ma la risposta è stata aggiornata per usare '--null' comunque. Questo non è ancora lo standard POSIX, ma a volte gli standard ufficiali richiedono tempo per raggiungere il mondo reale. –

+0

@ JonathanLeffler Sì, grazie. Risposta aggiornata .. – John1024

+1

Ha funzionato. Grazie mille Giovanni !! – PRK

3

Here is a safe way:

grep -lr magenta . | xargs -0 rm -f -- 
  • -l file di stampe nomi dei file che corrispondono ai criteri di ricerca.
  • -r esegue una ricerca ricorsiva per il modello magenta nella directory specificata .. Se questo non funziona, prova -R. (vale a dire, come nomi multipli anziché uno).
  • xargs -0 alimenta i nomi dei file da grep a rm -f
  • -- viene spesso dimenticato, ma è molto importante per segnare la fine delle opzioni e consentire la rimozione di file i cui nomi iniziano con -.

Se si desidera vedere quali file stanno per essere eliminati, è sufficiente rimuovere la parte | xargs -0 rm -f --.

+1

No; questo sta guardando i nomi dei file; la domanda sta guardando il contenuto del file. –

+0

Vedere il mio [commento] (http://stackoverflow.com/questions/31779632/how-to-remove-files-using-grep-andrr/31779697?noredirect=1#comment51489207_31779688) su '-Z' e portabilità (o la mancanza di). Anche l'opzione '-I' soffre di non-portabilità. –

+0

Grazie per questo @ Jonathan Leffler. Modifica la risposta – SriniV