Cómo eliminar un archivo con caracteres no imprimibles en la Terminal de Mac OS X [duplicado]

7

Posible duplicado:
eliminación de archivos con caracteres extraños en el nombre de archivo en OS X

Tengo una carpeta que tiene un archivo cuyo nombre es Iconos y termina con un carácter adicional no imprimible. Puedo ver la no imprimible si estoy con la opción -B:

$ ls -B
$ Icon\015

si uso ls -b obtengo:

$ ls -b
$ Icon\r

Me gustaría eliminar el archivo, pero no puedo encontrar una manera de escribir el carácter no imprimible. Si lo hago:

$ rm Icon\015

Yo obtengo:

$ Icon\015: No such file or directory

Si lo hago:

$ rm Icon\r

Yo obtengo:

$ Icon\r: No such file or directory

Podría eliminar toda la carpeta, pero necesito una forma más genérica de hacerlo, ya que estos archivos aparecen en las carpetas de muchos usuarios.

Mantenimiento periódico
fuente
2
Si no hay otros archivos que comiencen con Icon, intente rm Icon*. Alternativamente, escriba rm Icony luego presione la tecla <Tab> (completaría el nombre de archivo, si solo hay un archivo que comienza con Icon).
lupincho
@lupincho: El método clave <Tab> funciona, de hecho obtengo Icon ^ M de esta manera. Pero necesito algo que pueda escribir en un script de shell para automatizar la eliminación de dichos archivos. Por cierto: Escribir icono ^ M no funciona ....
Mantenimiento periódico
¿Qué sucede si lo intentas rm -i Icon*? Además, ¿hay otros archivos Iconen el mismo directorio pero que no quieres eliminar?
lupincho
@lupincho: rm -i Icon * funcionará, sin embargo, requerirá la atención del operador. Puede haber otros archivos que comienzan con Icon, por lo que no puedo arriesgarme a que estos otros archivos se borren.
Mantenimiento periódico el
Estos archivos contienen un icono de carpeta especificado por el usuario. ¿Por qué querrías eliminarlos en primer lugar? Después de todo, es una decisión de los usuarios darle a esa carpeta un aspecto personalizado. El nombre contiene ese carácter a propósito para que no sea fácil de eliminar.
heiglandreas

Respuestas:

3

El shell transformará automáticamente cada CR ( \r) en un LF ( \n) y ejecutará el comando anterior. Sin embargo, puede usar echopara producir un personaje LF. Todo esto debería funcionar:

rm $(echo -e "Icon\r")

rm $(echo -e "Icon\015")

echo -e "Icon\r" | xargs rm

echo -en "Icon\r" | xargs -0 rm

La última opción debe ser bastante robusta y tratar con todos los posibles personajes extraños.

Dennis
fuente
El icono es un archivo, no un directorio, por lo que su método funciona, reemplazando rmdir con rm. Este método podría funcionar en scripts de shell, por lo que funciona para mí. La opción -e para hacer eco no aparece en la página del manual, ¿cómo lo hiciste? En cualquier caso, aceptaré la respuesta. ¡Gracias!
Mantenimiento periódico
Correcto, leí mal la primera oración de la pregunta. men echomuestra -e enable interpretation of backslash escapes.
Dennis
2

Hay varias formas de incluir caracteres que no se imprimen en una línea de comando. La opción más simple (solo bash) es usar $antes de una cadena entre comillas simples, lo que hace que bash escape la sustitución dentro de la cadena. Tenga en cuenta que maneja varios tipos de secuencias de escape, por lo que ambas funcionarían:

rm $'Icon\r'
rm $'Icon\015'

O bien, puede escribir Control-V antes de Control-M (también conocido como return), que le dice al shell "el siguiente carácter que escriba debe incluirse literalmente en el comando":

rm Icon^V^M

(Tenga en cuenta que ^ V no es realmente parte del comando, por lo que no hará eco en la línea de comando).

Gordon Davisson
fuente
El método $ funciona tan bien como el método echo -e. Es una buena solución, gracias.
Mantenimiento periódico el
0

Para un carácter no imprimible puede usar '?' como comodín para un personaje. Entonces, abc? Def? .Zip significaría abc1def2.zip y también abc! Def # .zip.

pbies
fuente