Переименовать файл со странным именем на Samba mount

10

Я хочу переименовать файл со странным именем во что-то разумное, однако я не могу: /

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

Я попытался использовать номер инода, как было рекомендовано в нескольких местах в Интернете:

$ 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

Что я должен делать?

серый волк
источник
1
Каков вывод простого lsв этом каталоге? Файл отображается как обычный файл? Я прошу убедиться, что No such file or directoryэто ошибочная ошибка, которая не указывает на поврежденную файловую систему.
Terdon
1
Интересно, нужно ли запускать файловую систему fsck? Я могу быть испорчен. Как файл получил это имя?
Кусалананда
1
@Mioriin Знаки вопроса в имени файла (или вполне могут быть) заполнителями для символов, которые не могут быть отображены. (одна из причин никогда не анализировать результаты ls)
Кусалананда
1
Это может быть проблема с терминальным шрифтом. Он показывает ?для букв, которые не могут отображаться. Попробуйте перейти на полностью Unicode шрифт.
Мио Рин
5
@Mioriin Я думаю, что в этом случае может показаться, что имя файла может показаться чем-то вроде красной сельди. Странно, что оболочка может расширяться, *_000c.jpgно mvзатем не может обработать файл. Это, ИМХО, свидетельствует о повреждении файловой системы. ... или, возможно, файловой системы, которая смонтирована на удаленном сетевом ресурсе (с кэшированными записями каталога), или чем-то еще.
Кусалананда

Ответы:

16

Резюме соответствующих комментариев:

Файловые системы Unix допускают любой символ в имени файла, кроме \0(nul) и /(косая черта). Факт, который lsпоказывает вопросительные знаки, только потому, что он не может отображать некоторые символы имени файла в текущей локали (что является одной из причин, почему вы должны избегать анализа выводаls ).

Однако, с общим ресурсом Samba, вы, очевидно, предъявляете более строгие требования к именам файлов, чем к стандартной файловой системе Unix.

Поскольку имя файла было «незаконным» на промежуточном общем ресурсе Samba, файл был недоступен по правильному имени на машине, монтирующей общий ресурс.

Это mvне сработало, поскольку имя, возвращаемое из общего ресурса Samba для расширения шаблона смещения, было не фактическим именем файла в файловой системе хоста, а только собственной искаженной версией имени Samba.

Ваше решение состояло в том, чтобы войти на сервер, на котором фактически размещался файл (в файловой системе с менее строгими правилами именования, чем в Samba), и изменить имя файла на нем. Это был правильный курс действий.

См. Также чат Unix & Linux по этому вопросу .

Кусалананда
источник
-2

Прежде чем я узнал о цитировании в оболочках Unix, я использовал diredрежим emacs для переименования или удаления трудно сопоставляемых файлов. Вы просто открываете каталог в emacs:

emacs -q .

... затем вы можете использовать клавиши со стрелками, чтобы перейти к файлу, который вы хотите изменить, и переименовать файл R. ?выдаст вам список доступных команд (вы также можете удалить файлы, которые трудно сопоставить).

Тогда вы просто C-x C-cвыходите из Emacs и все готово.

Джим К.
источник
-3

Часто с необычными именами файлов вы можете добавить «./», прежде чем имя файла и Linux будет правильно его распознавать. Например: $ ls ./?j?Z?R?C1_000c.jpg

bootbeast
источник