Важно понимать, что это не тот тип «повреждения файловой системы», fsck
который поможет с этим. Что касается файловой системы, то имена файлов могут быть любой последовательностью байтов , если ни один байт не имеет значения 0x00 (ASCII NUL, маркер конца строки C) или 0x2F ( /
разделитель каталогов). (Если имя файла каким-либо образом вставляется в байт 00 или 2F,fsck
следует исправить.)
Скорее, у вас есть имена файлов, которые, по ls
мнению прикладного программного обеспечения (Dolphin ), содержат символы, которые невозможно отобразить в вашей «локали», поэтому он заменяет их символами-заполнителями. Вы также не можете вводить эти символы, так что манипулировать файлами сложнее, но вы можете делать это до тех пор, пока вы не наберете, не скопируете и не вставите имя. Например, если вы удаляете или переименовываете проблемные файлы непосредственно из Dolphin, это должно работать просто (я бы сказал, что если это не работает, это ошибка в Dolphin).
Если вам нужно что-то с ними сделать из оболочки (например, если они принадлежат root
и, следовательно, не могут быть изменены программой с графическим интерфейсом), вы можете указать их косвенно, используя шаблоны «glob», которые будут расширены до правильной последовательности. (s) байтов и переданы.
Теперь, конечно, вы не захотите удалить материал случайно, потому что ваш шаблон глобуса слишком сильно совпадает, поэтому я рекомендую использовать rename
утилиту Perl для преобразования каждого имени файла в его шестнадцатеричную кодировку:
$ rename '$_ = unpack("H*", $_)' *
Это не уничтожает какую-либо информацию - ни сам файл, ни какое-либо значение, возможно, изначально были закодированы в имени файла до того, как оно было искажено. Это может быть отменено для определенных файлов, например,
$ rename '$_ = pack("H*", $_)' 696d706f7274616e742e646f63
Осторожно: есть две названные программы rename
из разных источников; вышеупомянутые команды будут работать только с той, которая возникла в Perl. В Ubuntu вам нужен тот, что из пакета «переименовать», а не тот, из пакета «util-linux». rename -h
будет отличать: это то, что вы хотите ...
$ rename -h
Usage:
rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr
[ files ]
# ...
... это не то, что вы хотите ...
$ rename -h
Usage:
rename [options] <expression> <replacement> <file>...
# ...
Ключевая вещь, чтобы искать это "Perlexpr". У вас может быть более старая версия переименования Perl, которая не понимает все перечисленные выше параметры, но команда, которую я показал, должна работать.
Изменить: до 14.04 .5 скрипт perl, который включен для rename
, не поддерживает ключ -h. Вы можете подтвердить, что у вас есть правильный, проверив его справочную страницу, и man rename
в этом случае верхняя строка будет содержать:
RENAME (1) Справочное руководство по программированию на Perl RENAME (1)