dando salida grep a rm

47

Estoy tratando de canalizar la grepsalida a rm, pero produce cosas inútiles. ¿Se requiere algún cambio rm? ¿O se le rmpuede proporcionar una expresión regular directamente?

ls | grep '^\[Daruchini'| rm

rm: operando faltante Pruebe `rm --help 'para obtener más información.

CodeBladeRunner
fuente
Copie y pegue siempre los mensajes de error. (He insertado el mensaje de error real para beneficio de futuros lectores. Pero solo pude hacer esto porque solo hay un posible mensaje de error en este caso. La mayoría de las veces, es vital tener el mensaje de error exacto para comprender el problema . Así que siempre copiar y pegar todos los mensajes de error en su totalidad).
Gilles 'SO siendo parada del mal'

Respuestas:

57

Debe usar xargspara convertir la entrada estándar en argumentos para rm.

$ ls | grep '^Dar' | xargs rm

(Tenga cuidado con los caracteres especiales en los nombres de archivo; con GNU grep, puede preferir

$ ls | grep -Z '^Dar' | xargs -0 rm

)

Además, aunque el shell no usa expresiones regulares, ese es un patrón simple:

$ rm Dar*

(Mientras tanto, creo que necesito dormir más).

geekosaur
fuente
2
Asumiendo que el autor de la pregunta no cometió un error cuando publicó la pregunta, está buscando rm Dar*, no rm !(Dar*).
Gilles 'SO- deja de ser malvado'
... cierto, sí, estaba atascado en el zsh ^modo (similar a la basg !cosa).
geekosaur
1
+1 Gran respuesta, tuve que agregar | tr "\n" "\0"antes del xargsbit. Visto en esta publicación: stackoverflow.com/questions/20307299/…
Adam Plocher
5

No analice la salida dels .

Aquí, es muy simple hacer que el shell filtre los archivos que desea. Tenga en cuenta que es el shell lo que está expandiendo el patrón Dar*, no el rmcomando. La expansión del patrón realizada por el shell se llama globbing .

rm Dar*

En casos más complejos, busque el findcomando.

Gilles 'SO- deja de ser malvado'
fuente
3

Si desea delimitar la salida de greppor líneas nuevas en lugar de espacios en blanco, puede especificarlo a xargstravés de la -dopción.

$ ls | grep '^Dar' | xargs -d '\n' rm

(como se describe en esta pregunta)

mherzl
fuente
2

Para pasar la salida como argumento, tiendo a usar un ciclo while ya que no estoy familiarizado con xargs.

ls | grep '^Dar' | while read line; do rm "$line";done;
Mitones
fuente
Este es el único que funcionó en mi caso.
marbel
0

El mejor comando para mí es:

find ./Daruchini* -exec rm {}\;
Bodale
fuente