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 ls
hacia xargs
. En su lugar, canalice find ... -print0
a 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 rm
con un comodín.
Normalmente, ls
separe find
los nombres de los archivos con nuevas líneas, pero xargs
divide su entrada por nueva líneaoespacio, lo que resulta en el comportamiento que ves.
Es posible xargs
dividir 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, -print0
se indica find
que separe los nombres de archivos con un byte nulo; igual por xargs -0
. (Algunas otras herramientas también tienen opciones similares, como sort -z
o grep -zZ
).
La "versión corta" utiliza un comodín de shell simple ("patrón" enbash
manual– consulte la sección "Expansión de la ruta de acceso").