Estoy tratando de eliminar todos los archivos con un espacio en sus nombres. Estoy usando el siguiente comando. Pero me esta dando un error
Comando: ls | egrep '. ' | xargs rm
Aquí, si estoy usando solo el ls | egrep '. 'comando, me está dando todo el nombre del archivo con espacios en los nombres de archivo. Pero cuando intento pasar la salida a rm, todos los espacios (iniciales o finales) se eliminan. Entonces mi comando no se ejecuta correctamente.
¿Algún indicador sobre cómo eliminar el archivo que tiene al menos un espacio en su nombre?

echoprimera vez, para evitar errores tipográficos. Agregueechoal frente e imprimirá todos los archivos que va a eliminar.findes poderoso, a veces no es necesario matar al pollo con una ametralladora. Los administradores de UNIX generalmente no recurrirían afind(por ejemplo) "eliminar todos los archivos que comiencen con la letra A" ... uno simplemente lo haríarm A*. Del mismo modo, para eliminar archivos que contienen espacios, rm puede hacer el trabajo. En otras palabras, no se deje engañar porque el espacio es invisible y es tratado especialmente por el caparazón. Simplemente escapa, como lo ha hecho Stephen Kitt, y puedes pensarlo como cualquier otro personaje.Evitaría analizar la
lssalidaPor qué no :
No hay problema con
rm:-).Aunque esto es recursivo y eliminará todos los archivos con espacio en el directorio actual y directorios anidados, como se menciona en los comentarios.
fuente
-name '* *'lugar de la expresión regular; y (2) puede usar-print0 | xargs -0 rm -ipara abordar la preocupación de @ StephenKitt.xargs. Simplemente use-exec rm -i '{}' +find . -maxdepth 1 -name '* *' -delete.Mire esto Suponga el nombre "archivo extraño"
Solución uno
solución dos
solución tres
ves el inodo entonces
En caso de nombres de archivo muy extraños como
utilizar
fuente
De
man xargsPodemos (principalmente) arreglar su comando inicial cambiando el delimitador xargs a una nueva línea:
ls | egrep '. ' | xargs -d '\n' rm(no hagas esto ... sigue leyendo)Pero, ¿qué pasa si el nombre del archivo contiene una nueva línea?
touch "filename with blanks and newline"lses realmente una herramienta para el consumo directo de un humano , en su lugar necesitamos usar elfindcomando que puede separar los nombres de archivo con un carácter nulo (-print0). También necesitamos decirle a grep que use caracteres nulos para separar la entrada (-z) y la salida (-Z). Finalmente, le decimos a xargs que también use caracteres nulos (-0)find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rmfuente
Puedes usar:
fuente
Para hacerlo de esa manera, necesitará la
-Zopción de grep y la-0opción de xargs. Pero no lo haría de esa manera (lsno es la herramienta adecuada para el trabajo, hay muchos problemas para que la computadora lea su salida).Ver otras respuestas para una mejor manera.
también
ls | …es equivalente als -d *yecho * | …Todos los cuales tienen problemas. Por lo tanto, no lo use
lsasí, use una solución de otra respuesta.fuente
ls *cuando las tuberías generan los nombres de archivo delimitados por nueva línea.echo(al menos algunasechoimplementaciones) expande las secuencias de barra invertida.grep -Zes para escribir nombres de archivo delimitados por NUL cuando se usa-l, no ayudará aquí. Si quiere decir-z, eso tampoco ayudará, ya que la mayoría de laslsimplementaciones carecen de una opción para generar nombres de archivo delimitados por NUL.printf '%s\0' * | grep -z ' ' | xargs -r0 rm -fAunque se podría hacer algo así .