ls | grep | rm - Come formattare questo comando?


11

Sto cercando di eliminare un mucchio di file in una determinata directory (su Mac OS X usando Terminal)

ls | grep \([1-9]\) | xargs rm

dovrebbe fare il trucco, ma non lo fa. Sto cercando di eliminare qualsiasi file con una singola cifra tra parentesi nel nome del file (duplicati scaricati dal web), ma finisce per fare qualcosa del genere:

> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory

perché non interpreta lo spazio corretto. Dovrebbe eliminare "520syllabus2010 (3) .pdf"

Qual è il modo corretto di farlo?

Grazie Jeff


1
Il tuo nome file di esempio non contiene un valore letterale #.
Benjamin Bannier,

1
@honk: non sta cercando un letterale #.
Ignacio Vazquez-Abrams,

1
A causa dell'espansione della shell, questo non funzionerà come previsto se il cwd ha un file chiamato eg (3). È meglio citare gli argomenti in modo che la shell non li influenzi.
Ignacio Vazquez-Abrams,

1
Sei stato colpito dal problema del separatore en.wikipedia.org/wiki/Xargs#The_separator_problem
Ole Tange,

Risposte:


19

Versione breve:

rm *\([1-9]\)*

Non lseseguire il piping a xargs. Invece, find ... -print0eseguire il pipe to xargs -0, al fine di evitare tali problemi.

find . -maxdepth 1 -name '*([1-9])*' -print0 | xargs -0 rm

... che può essere scritto come:

find . -maxdepth 1 -name '*([1-9])*' -exec rm {} \;

e:

find . -maxdepth 1 -name '*([1-9])*' -delete

che può essere ulteriormente abbreviato solo rmcon un carattere jolly.


Normalmente, lse findnomi di file separati con a capo, ma xargsdivide il suo ingresso dal ritorno a capo o lo spazio, con la conseguente comportamento che si vede.

È possibile dire xargsdi dividere solo per newline, ma anche i file possono avere newline nei loro nomi. In effetti, su Linux e BSD, l' unico carattere non consentito è il byte "null" o zero - quindi è quello che dovresti usare in questi casi.

Nell'esempio 2 sopra, -print0dice finddi separare i nomi di file con un byte null; lo stesso per xargs -0. (Alcuni altri strumenti hanno anche opzioni simili, come sort -zo grep -zZ.)

La "versione corta" utilizza un semplice carattere jolly della shell ("modello" nel bashmanuale - vedere la sezione "Espansione percorso").


1
E solo per sicurezza, è meglio usare in *" "\\([1-9]\\).*modo che vengano eliminati solo i file con uno spazio prima del numero paren'd prima del periodo (a, per essere onesti).
Ignacio Vazquez-Abrams,

Non ho molta familiarità con questa sintassi, ma in base ai voti ho provato e cosa sai ... ha funzionato! Grazie!
Jeff,

1
+1. -print0 è essenziale per il corretto piping di xargs.
Chris W. Rea,
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.