Cambiar el nombre del archivo con un nombre extraño en el montaje Samba

10

Quiero cambiar el nombre del archivo con un nombre extraño a algo razonable, sin embargo no puedo: /

$ mv *_000c.jpg 000c.jpg
mv: cannot move '?j?Z?R?C1_000c.jpg' to '000c.jpg': No such file or directory

Intenté usar el número de inodo como se recomendó en algunos lugares en Internet:

$ ls -il *000c.jpg
ls: '?j?Z?R?C1_000c.jpg': No such file or directory
213915 -rw-r--r-- 1 wolf wolf 794655 Jul 21  2012 '?j?Z?R?C1_000c.jpg'
$ find . -inum 213915 -print0 | xargs -0 -I '{}' mv '{}' 000c.jpg
mv: cannot move './?j?Z?R?C1_000c.jpg' to '000c.jpg': No such file or directory

¿Qué tengo que hacer?

Lobo gris
fuente
1
¿Cuál es el resultado de un simple lsen ese directorio? ¿El archivo se muestra como un archivo normal? Estoy pidiendo asegurarme de que se No such file or directorytrata de un error global y no es indicativo de un sistema de archivos dañado.
terdon
1
Me pregunto si es necesario ejecutar el sistema de archivos fsck. Puedo estar corrompido. ¿Cómo adquirió el archivo ese nombre?
Kusalananda
1
@Mioriin Los signos de interrogación en el nombre del archivo son (o bien pueden ser) marcadores de posición para los caracteres que no se pueden mostrar. (una razón para no analizar nunca la salida de ls)
Kusalananda
1
Esto podría ser un problema de fuente terminal. Se muestra ?para letras que no puede mostrar. Intente cambiar a una fuente totalmente unicode.
Mio Rin
55
@Mioriin Creo que si el nombre del archivo se puede mostrar o no, es un poco una pista falsa en este caso, creo. Lo extraño es que el shell puede expandirse, *_000c.jpgpero eso mvno puede procesar el archivo. Esto es, en mi humilde opinión, indicativo de un sistema de archivos corrupto. ... o posiblemente de un sistema de archivos que está montado en un recurso compartido de red que ha desaparecido (con las entradas del directorio todavía en caché), o algo así.
Kusalananda

Respuestas:

16

Resumen de comentarios relevantes:

Los sistemas de archivos Unix permiten cualquier carácter en un nombre de archivo aparte de \0(nul) y /(barra diagonal). El hecho de que lsmuestre signos de interrogación es solo porque no puede mostrar algunos de los caracteres del nombre de archivo en la configuración regional actual (que es una de las razones por las que debe evitar analizar la salida dels ).

Sin embargo, con un recurso compartido de Samba, aparentemente tiene requisitos más estrictos en los nombres de archivos que en un sistema de archivos Unix estándar.

Dado que el archivo tenía un nombre que era "ilegal" en su recurso compartido Samba intermedio, el archivo era inaccesible por su nombre correcto en la máquina que montaba el recurso compartido.

El mvno funcionó ya que el nombre de regresar de la cuota de Samba para la expansión del patrón de englobamiento no era el nombre real del archivo en el sistema de archivos de alojamiento, sólo la propia versión mutilada de Samba del nombre.

Su solución fue iniciar sesión en el servidor que realmente alojaba el archivo (en un sistema de archivos con reglas de nomenclatura menos restrictivas que Samba) y cambiar el nombre del archivo allí. Este fue el curso de acción correcto.

Vea también el chat de Unix y Linux sobre esta pregunta .

Kusalananda
fuente
-2

Antes de aprender sobre las citas en shells de Unix, usaba el diredmodo emacs para renombrar o eliminar archivos difíciles de igualar. Simplemente abra el directorio en emacs:

emacs -q .

... luego puede usar las teclas de flecha para navegar al archivo que desea modificar y cambiar el nombre del archivo R. ?le dará la lista de comandos disponibles (también puede eliminar archivos que son difíciles de igualar).

Entonces C-x C-csaliste de emacs y listo.

Jim K.
fuente
-3

A menudo, con nombres de archivo inusuales, puede agregar "./" antes del nombre de archivo y Linux lo reconocerá correctamente. Por ejemplo: $ ls ./?j?Z?R?C1_000c.jpg

bestia de arranque
fuente