Mientras desempacaba un tarball, encontré un directorio que ls
informa como "??????????????? ?????". Presumiblemente, el nombre no está en Unicode? De todos modos, no puedo encontrar una manera de acceder a la carpeta. Lo he intentado cd $(find -inum inode_number)
, pero eso me da
"bash: cd: ./??????????: No such file or directory".
¿Hay otra forma de acceder a una carpeta directamente por su número de inodo?
filenames
inode
directory-listing
jackd243
fuente
fuente
cd */
podría funcionar.*
debería expandir una descripción comprensible del directorio, ecd
ignora argumentos adicionales. Otra forma podría ser utilizar un administrador de archivos gráfico (incluido el MC basado en terminal) o los navegadores de árbol de archivos integrados en, por ejemplo, Vim. También puede experimentar con el-exec
cambio afind, not with
cd` directamente (que es un shell incorporado) pero con egls
y otras herramientas.cd
con múltiples argumentos falla.too many arguments
".Respuestas:
Un enfoque general para poder operar en cualquier directorio (o archivo) es usar su número de inodo.
Primero, use ls para obtener el inodo de la carpeta en cuestión:
-l
para listado largo (opcional)-i
para obtener valores de inodo-a
para ver todos los archivos, incluso los archivos ocultos (opcional)En la lista verá un número largo en la primera columna, algo como esto:
Ahora puede cambiar a ese directorio usando:
... pero sustituyendo ###### con el número largo que obtuvo en la lista del directorio.
Por supuesto, el comando no tiene que ser
cd
. Podría serrm
,cp
,mv
, etc ...fuente
Dado que los caracteres son probablemente caracteres internacionales, es probable que aparezcan como códigos de control en su conjunto de caracteres en_US, por lo que ls los muestra como signos de interrogación.
Esto puede deberse a la elección de su distribución de alias's ls por defecto en el perfil global. Por ejemplo:
Puede ver si su distribución lo ha hecho escribiendo en su shell:
Lo cual imprimirá algo como lo siguiente:
La página vinculada a continuación sugiere que si hace "ls -b", verá los códigos de control octal para que sepa al menos qué caracteres están en uso.
http://www.arsc.edu/arsc/support/howtos/nonprintingchars/
Suponiendo que eso no funciona, tiene otra opción que también se menciona más abajo:
Una herramienta que desconocía hasta ahora llamada OctalDump (en Debian - / usr / bin / od)
Le mostrará la forma octal de los códigos de control.
Le mostrará los caracteres, incluido cualquier espacio en blanco adicional oculto que pueda estar al final (tenga en cuenta los espacios adicionales al final en su ejemplo)
Una vez que sepa qué personajes de control están en juego y si hay espacios en blanco ocultos adicionales, puede encontrar una forma de cd al directorio escapando de los personajes de control. De lo contrario, tiene un par de opciones para cambiar el nombre del directorio.
La página de arriba también, convenientemente, tiene un método rápido y sucio para eliminar los caracteres de control a través del comando mv, que creo que funcionará, siempre y cuando escapes del espacio, pero NO escapes los signos de interrogación (por lo tanto, los convierte en un solo carácter comodines), y siempre que no exista nada más en el directorio donde se encuentra este directorio falso. La razón de estos requisitos explícitos se debe a que está utilizando solo caracteres comodín y el espacio único, por lo que no desea que el comodín coincida inadvertidamente con ningún otro archivo o directorio.
Si el método anterior no funciona, es casi seguro que puede usar el método de búsqueda mencionado por otras respuestas de una manera diferente. En lugar de intentar cd al directorio usando el número de inodo, que es lo que usted dijo que ha intentado, puede cambiarle el nombre usando el número de inodo. Solo asegúrese de copiar el conjunto completo de 3 líneas para ese comando de la página anterior (sin embargo, reemplace la parte "nombre deseado" con el nombre real al que desea cambiarle el nombre).
Una vez que se cambia el nombre del directorio, debería poder acceder a él. Solo puedo esperar que no contenga también archivos con códigos de control en los nombres, o tendrá que enjuagar y repetir para cada archivo (y / o subdirectorio) en el directorio que acaba de cambiar de nombre, en ese momento un bucle for probablemente sea sabio nombrar cada archivo como un número, incrementando desde 1. :-)
fuente
"?" tiene un significado especial en el shell, significa "cualquier carácter, incluido ninguno". Entonces, si su archivo realmente se llama "??????????????? ?????" probablemente tengas que escapar del "?" (y espacios también) para que puedas probar algo como cd \? \? \? \? \? \? \ \? \? \? \? (si no lo intentaste ya)
Eso supone que alguien le dio intencionalmente al archivo ese nombre complicado, en lugar de una codificación ilegible / corrupta / ilegal.
fuente
ls
le gusta mostrar caracteres no ASCII (≥0x7F) como?
–– por lo que el nombre del directorio probablemente no sea solo una cadena de signos de interrogación.Hacer un
ls
. ¿Hay algo en el directorio (archivo o subdirectorio) con un nombre que sea más largo que su misterioso subdirectorio (que es 21, si su "??????????????? ?????" es preciso)? Luego cámbieles el nombre a nombres más cortos o muévalos a otros directorios. Luego escribeEste comodín (20 signos de interrogación seguidos de un asterisco) debe coincidir con cualquier nombre que tenga 20 caracteres de longitud o más, y la primera instrucción que di debería haber asegurado que su subdirectorio misterioso sea lo único que coincida con ese patrón. Pero podría ser más útil hacer
fuente
ls
con la opción--quoting-style=shell
u--quoting-style=escape
opción para forzarlo a producir una versión con escape del nombre del archivo.Una manera fácil de ver lo que hay allí es FTP a la máquina con FileZilla. Luego puede usar FileZilla para cambiar el nombre del directorio.
fuente
Utilice un navegador de archivos como Midnight Commander (texto), Nautilus (GNOME) o Dolphin (KDE) para trabajar con el directorio.
fuente
para trabajar con directorios (o archivos) que tienen nombres extraños / difíciles de escribir:
1) Ejecutar
ls -i
para descubrir el inodo del archivo.Esta
ls
opción le dará cada nombre de archivo y un identificador para este archivo en el sistema de archivos (el inodo)2) Use find para ejecutar un comando en el archivo
decir que el inodo era 9961926
podrías correr
para eliminar el archivo
o
para moverlo a un mejor nombre
o incluso
darle un nuevo nombre manteniendo el antiguo nombre
(presumiblemente, también podría ejecutar otros comandos. Desafortunadamente no pude usar esta línea para ejecutar a
cd
)fuente