Eliminar archivos con espacios en sus nombres

10

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?

Anuj
fuente

Respuestas:

29

Puede usar globbing estándar en el rmcomando:

rm -- *\ *

Esto eliminará cualquier archivo cuyo nombre contenga un espacio; se escapa el espacio para que el shell no lo interprete como un separador. Agregar --evitará problemas con los nombres de archivo que comienzan con guiones (no serán interpretados como argumentos por rm).

Si desea confirmar cada archivo antes de que se elimine, agregue la -iopción:

rm -i -- *\ *
Stephen Kitt
fuente
44
Definitivamente querrá ejecutar esto por echoprimera vez, para evitar errores tipográficos. Agregue echoal frente e imprimirá todos los archivos que va a eliminar.
Riking
1
Anuj, la razón por la que tiene más votos positivos es que, aunque findes poderoso, a veces no es necesario matar al pollo con una ametralladora. Los administradores de UNIX generalmente no recurrirían a find(por ejemplo) "eliminar todos los archivos que comiencen con la letra A" ... uno simplemente lo haría rm 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.
Mike S
14

Evitaría analizar la lssalida

Por qué no :

find . -type f -name '* *' -delete

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.

solsticio
fuente
44
(1) puede usar en -name '* *'lugar de la expresión regular; y (2) puede usar -print0 | xargs -0 rm -ipara abordar la preocupación de @ StephenKitt.
Kevin
1
No hay necesidad de xargs. Simplemente use-exec rm -i '{}' +
R .. GitHub DEJE DE AYUDAR A HIELO
1
@Mhmd Tiene más dificultades que una consola de juegos de 8 bits. mywiki.wooledge.org/ParsingLs
Daenyth
1
Si desea evitar subdirectorios, use find . -maxdepth 1 -name '* *' -delete.
Mikkel
1
@BenjaminW. arreglado?
solSTiCe
6

Mire esto Suponga el nombre "archivo extraño"

Solución uno

rm strange\ file

solución dos

rm "strange file"

solución tres

ls -i "strange file"

ves el inodo entonces

find . -inum "numberoofinode" -exec rm {} \;

En caso de nombres de archivo muy extraños como

!-filename or --filename

utilizar

rm ./'!-filename'
elbarna
fuente
4

De man xargs

xargs lee elementos de la entrada estándar, delimitados por espacios en blanco (que se pueden proteger con comillas dobles o simples o una barra diagonal inversa) o líneas nuevas, y ejecuta el comando (el valor predeterminado es / bin / echo) una o más veces con cualquier argumento inicial seguido por elementos leídos de la entrada estándar. Las líneas en blanco en la entrada estándar se ignoran.

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"

Debido a que los nombres de archivo Unix pueden contener espacios en blanco y líneas nuevas , este comportamiento predeterminado suele ser problemático; xargs procesa incorrectamente los nombres de archivo que contienen espacios en blanco y / o nuevas líneas. En estas situaciones, es mejor usar la opción -0 , que evita tales problemas.

ls es realmente una herramienta para el consumo directo de un humano , en su lugar necesitamos usar el findcomando 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

anjsimmo
fuente
1

Puedes usar:

find . -name '* *' -delete
Max ZHUANG
fuente
rm - * \ * parece mejor
Max ZHUANG
Además, esto fue cubierto por el comentario de Kevin sobre la respuesta de solsTiCe.
G-Man dice 'reinstalar a Monica' el
-1

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 a ls -d *yecho * | …

Todos los cuales tienen problemas. Por lo tanto, no lo use lsasí, use una solución de otra respuesta.

ctrl-alt-delor
fuente
También ls *cuando las tuberías generan los nombres de archivo delimitados por nueva línea. echo(al menos algunas echoimplementaciones) 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 las lsimplementaciones 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í .
Stéphane Chazelas
1
@Kusalananda Creo que lo he arreglado.
ctrl-alt-delor