Estoy tratando de eliminar un montón de archivos en un determinado directorio (en Mac OS X usando Terminal)
ls | grep \([1-9]\) | xargs rm
debería hacer el truco, pero no es así. Estoy tratando de 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 correcto. Debería eliminar "520syllabus2010 (3) .pdf"
¿Cuál es la forma correcta de hacer esto?
Gracias Jeff

#.#.(3). Es mejor citar argumentos para que el shell no los afecte.Respuestas:
Version corta:
No canalizar
lsaxargs. En su lugar, diríjasefind ... -print0axargs -0, para evitar tales problemas.... que se puede escribir como:
y:
que se puede acortar a solo
rmcon un comodín.Normalmente,
lsyfindlos nombres de archivos separados con saltos de línea, peroxargsdivide su entrada por salto de línea o espacio, lo que resulta en el comportamiento que se ve.Es posible indicar
xargsque se divida solo por nueva línea, pero los archivos también pueden tener nuevas líneas en sus nombres. De hecho, en Linux y BSD, el único carácter no permitido es el byte "nulo" o cero , por lo que es lo que debe usar en tales casos.En el ejemplo 2 anterior,
-print0le dicefindque separe los nombres de archivo con un byte nulo; mismo paraxargs -0. (Algunas otras herramientas también tienen opciones similares, comosort -zogrep -zZ).La "versión corta" utiliza un comodín de shell simple ("patrón" en el
bashmanual ; consulte la sección "Expansión del nombre de ruta").fuente
*" "\\([1-9]\\).*para que solo se eliminen los archivos con un espacio antes del número pareado antes del período (a, para ser justos).