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?
echo
primera vez, para evitar errores tipográficos. Agregueecho
al frente e imprimirá todos los archivos que va a eliminar.find
es 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
ls
salidaPor 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 -i
para 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 xargs
Podemos (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"
ls
es realmente una herramienta para el consumo directo de un humano , en su lugar necesitamos usar elfind
comando 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 rm
fuente
Puedes usar:
fuente
Para hacerlo de esa manera, necesitará la
-Z
opción de grep y la-0
opción de xargs. Pero no lo haría de esa manera (ls
no 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
ls
así, 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 algunasecho
implementaciones) expande las secuencias de barra invertida.grep -Z
es 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 lasls
implementaciones carecen de una opción para generar nombres de archivo delimitados por NUL.printf '%s\0' * | grep -z ' ' | xargs -r0 rm -f
Aunque se podría hacer algo así .