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
ls
axargs
. En su lugar, diríjasefind ... -print0
axargs -0
, para evitar tales problemas.... que se puede escribir como:
y:
que se puede acortar a solo
rm
con un comodín.Normalmente,
ls
yfind
los nombres de archivos separados con saltos de línea, peroxargs
divide su entrada por salto de línea o espacio, lo que resulta en el comportamiento que se ve.Es posible indicar
xargs
que 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,
-print0
le dicefind
que separe los nombres de archivo con un byte nulo; mismo paraxargs -0
. (Algunas otras herramientas también tienen opciones similares, comosort -z
ogrep -zZ
).La "versión corta" utiliza un comodín de shell simple ("patrón" en el
bash
manual ; 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).