Я хочу переименовать файл со странным именем во что-то разумное, но не могу :/
$ 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
Резюме соответствующих комментариев:
Файловые системы Unix допускают любой символ в имени файла, кроме \0
(nul) и /
(косая черта). Тот факт, что ls
отображаются вопросительные знаки, объясняется тем, что некоторые символы имени файла не могут быть отображены в текущей локали (что является одной из причин, по которойвам следует избегать анализа выходных данныхls
).
Однако при использовании общего ресурса Samba, по-видимому, существуют более строгие требования к именам файлов, чем в стандартной файловой системе Unix.
Поскольку файл имел «недопустимое» имя на вашем промежуточном ресурсе Samba, файл был недоступен по его правильному имени на машине, смонтировавшей ресурс.
Это mv
не сработало, поскольку имя, возвращенное из общего ресурса Samba для расширения шаблона подстановки, не было фактическим именем файла в файловой системе хостинга, а лишь собственной искаженной версией имени Samba.
Ваше решение заключалось в том, чтобы войти на сервер, на котором фактически размещался файл (в файловой системе с менее строгими правилами именования, чем Samba), и изменить имя файла там. Это был правильный курс действий.
См. также Unix&Linuxпообщаться по этому вопросу.
решение2
До того, как я узнал о кавычках в оболочках unix, я использовал режим emacs dired
для переименования или удаления файлов, которые трудно сопоставить. Вы просто открываете каталог в emacs:
emacs -q .
... затем вы можете использовать клавиши со стрелками, чтобы перейти к файлу, который вы хотите изменить, и переименовать файл с помощью R
. ?
вы получите список доступных команд (вы также можете удалить файлы, которые трудно сопоставить).
Затем вы просто C-x C-c
выходите из Emacs и все готово.
решение3
Часто с необычными именами файлов вы можете добавить "./" перед именем файла, и Linux правильно его распознает. Например: $ ls ./?j?Z?R?C1_000c.jpg