Ir al directorio con nombre desconocido

8

Mientras desempacaba un tarball, encontré un directorio que lsinforma 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?

jackd243
fuente
¿Es quizás léxico primero en el listado del directorio? Entonces cd */podría funcionar. *debería expandir una descripción comprensible del directorio, e cdignora 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 -execcambio a find, not with cd` directamente (que es un shell incorporado) pero con eg lsy otras herramientas.
Daniel Andersson el
@Daniel: En algunos shells, cdcon múltiples argumentos falla.
Scott
@Scott: Cierto. POSIX no especifica el comportamiento de múltiples argumentos. Bash y Dash ignoran argumentos adicionales, csh sale con " too many arguments".
Daniel Andersson

Respuestas:

3

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:

ls -lia
  • -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:

2104697 drwx------ 2 user group 4096 date time WEIRD_DIRNAME

Ahora puede cambiar a ese directorio usando:

cd "$(find -inum ######)"

... 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 ser rm, cp, mv, etc ...

Tyilo
fuente
2

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:

alias ls='ls -q'

Puede ver si su distribución lo ha hecho escribiendo en su shell:

alias ls

Lo cual imprimirá algo como lo siguiente:

$ alias ls
alias ls='ls --color=auto'

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)

$ ls | od -b

Le mostrará la forma octal de los códigos de control.

$ ls | od -c

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. :-)

Speeddymon
fuente
0

"?" 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.

Valrian
fuente
1
Pero recuerde que lsle 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.
Scott
0

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 escribe

cd ????????????????????*

Este 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

mv ????????????????????* nuevo nombre

Scott
fuente
3
Puede ser útil ejecutar lscon la opción --quoting-style=shellu --quoting-style=escapeopción para forzarlo a producir una versión con escape del nombre del archivo.
Dan D.
1
@DanD. +1 para la opción genial que no conocía. Por lo general, solo uso un administrador de archivos GUI cuando algo como esto tiene que ser tratado, pero podría ser útil si tengo que trabajar desde una consola o dentro de un script.
Joe
0

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.

kmort
fuente
0

Utilice un navegador de archivos como Midnight Commander (texto), Nautilus (GNOME) o Dolphin (KDE) para trabajar con el directorio.

Michael Hampton
fuente
0

para trabajar con directorios (o archivos) que tienen nombres extraños / difíciles de escribir:

1) Ejecutar ls -ipara descubrir el inodo del archivo.

Esta lsopció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

 find * -prune -inum 9961926 -exec rm -i {} \;

para eliminar el archivo

o

 find * -prune -inum 9961926 -exec mv {} other-name \;

para moverlo a un mejor nombre

o incluso

 find * -prune -inum 9961926 -exec ln -s {} non-horrible-name \;

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)

josinalvo
fuente