ls | grupo | rm - ¿Cómo formatear este comando?

ls | grupo | rm - ¿Cómo formatear este comando?

Estoy intentando eliminar un montón de archivos en un directorio determinado (en Mac OS X usando Terminal)

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

Debería funcionar, pero no es así. Estoy intentando eliminar cualquier archivo con un solo dígito entre paréntesis en el nombre del archivo (duplicados descargados de la web), pero termina haciendo algo como esto:

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

porque no interpreta el espacio correctamente. Debería eliminar "520syllabus2010 (3).pdf"

¿Cuál es la forma correcta de hacer esto?

gracias jeff

Respuesta1

Version corta:

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

No canalice lshacia xargs. En su lugar, canalice find ... -print0a xargs -0, para evitar este tipo de problemas.

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

...que se puede escribir como:

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

y:

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

que se puede acortar aún más rmcon un comodín.


Normalmente, lssepare findlos nombres de los archivos con nuevas líneas, pero xargsdivide su entrada por nueva líneaoespacio, lo que resulta en el comportamiento que ves.

Es posible xargsdividir sólo por nueva línea, pero los archivospodertambién tienen nuevas líneas en sus nombres. De hecho, en Linux y BSD, elsolo personaje no permitidoes el"nulo"o byte cero– entonces es lo que debes usar en tales casos.

En el ejemplo 2 anterior, -print0se indica findque separe los nombres de archivos con un byte nulo; igual por xargs -0. (Algunas otras herramientas también tienen opciones similares, como sort -zo grep -zZ).

La "versión corta" utiliza un comodín de shell simple ("patrón" enbashmanual– consulte la sección "Expansión de la ruta de acceso").

información relacionada