Как вы можете видеть ниже, файлы имеют необычные символы.
Удаление их либо в терминале, либо в Dolphin возвращает ошибку:
Данный файл или каталог отсутствует
Запуск ls -la
в каталоге дал мне такой вывод:
-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ??
-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ?2?.???љ?!?Gb??σ?[?F?
-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??
-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 3l??#g?w????O?JKB7?co??քH??bT?NA???S???X?I?A?qC??M?I???
-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ??8??-?@,?Zp?[?bI????7^?ñ[?ڏ??z?O???ч??eEȰ?+??,OF??h
Я побежал fsck
выполнил команду на разделе из другой ОС, но это ничего не изменило.
Как мне удалить эти файлы?
files
filesystem
encoding
filename
karjedavpalaa
источник
источник
Ответы:
Простой способ - удалить эти файлы по их индоду. :)
Используйте
ls -li
в каталоге с необычными символами, чтобы показать номер индекса каждого файла, например,Затем с помощью
find
утилиты удалите соответствующий файл по его имени, используя синтаксисfind <somepath> -inum <inode_number> -exec rm -i {} \;
, как в следующем примере:Эта
-i
опцияrm
не является действительно необходимой, я просто добавил ее, чтобы предотвратить случайное удаление файлов, которые вы не хотели удалять. :) Это вызываетrm
запрос подтверждения для каждого файла, который вы хотите удалить.Если вы хотите удалить несколько файлов по их inode, вы можете использовать синтаксис
-o
(значение или ) дляfind
:Вы можете добавить больше номеров индексов, расширив выражение в скобках большим количеством
-o -inum <inode_number>
выражений.источник
rm -ri .
?rm -ri .
не удаляет файлы по inode. Он будет просто проходить по всему рабочему каталогу и запрашивать каждый файл, если вы хотите удалить его, и вы должны быть очень внимательны, какие файлы он запрашивает, чтобы случайно не удалить ненужные. Я, конечно, не хотел бы использовать эту команду для моего домашнего каталога - он содержит много файлов. ;)-inum
говоритfind
искать файлы по их номеру inode. (2){}
соответствует файлу (ам), найденномуgrep
. (3) \ экранирует;
символ, который завершает команду, переданную-exec
опцииfind
. (4) Я отредактировал свой ответ, чтобы объяснить, как удалить несколько файлов за один раз.Важно понимать, что это не тот тип «повреждения файловой системы»,
fsck
который поможет с этим. Что касается файловой системы, то имена файлов могут быть любой последовательностью байтов , если ни один байт не имеет значения 0x00 (ASCII NUL, маркер конца строки C) или 0x2F (/
разделитель каталогов). (Если имя файла каким-либо образом вставляется в байт 00 или 2F,fsck
следует исправить.)Скорее, у вас есть имена файлов, которые, по
ls
мнению прикладного программного обеспечения (Dolphin ), содержат символы, которые невозможно отобразить в вашей «локали», поэтому он заменяет их символами-заполнителями. Вы также не можете вводить эти символы, так что манипулировать файлами сложнее, но вы можете делать это до тех пор, пока вы не наберете, не скопируете и не вставите имя. Например, если вы удаляете или переименовываете проблемные файлы непосредственно из Dolphin, это должно работать просто (я бы сказал, что если это не работает, это ошибка в Dolphin).Если вам нужно что-то с ними сделать из оболочки (например, если они принадлежат
root
и, следовательно, не могут быть изменены программой с графическим интерфейсом), вы можете указать их косвенно, используя шаблоны «glob», которые будут расширены до правильной последовательности. (s) байтов и переданы.Теперь, конечно, вы не захотите удалить материал случайно, потому что ваш шаблон глобуса слишком сильно совпадает, поэтому я рекомендую использовать
rename
утилиту Perl для преобразования каждого имени файла в его шестнадцатеричную кодировку:Это не уничтожает какую-либо информацию - ни сам файл, ни какое-либо значение, возможно, изначально были закодированы в имени файла до того, как оно было искажено. Это может быть отменено для определенных файлов, например,
Осторожно: есть две названные программы
rename
из разных источников; вышеупомянутые команды будут работать только с той, которая возникла в Perl. В Ubuntu вам нужен тот, что из пакета «переименовать», а не тот, из пакета «util-linux».rename -h
будет отличать: это то, что вы хотите ...... это не то, что вы хотите ...
Ключевая вещь, чтобы искать это "Perlexpr". У вас может быть более старая версия переименования Perl, которая не понимает все перечисленные выше параметры, но команда, которую я показал, должна работать.
Изменить: до 14.04 .5 скрипт perl, который включен для
rename
, не поддерживает ключ -h. Вы можете подтвердить, что у вас есть правильный, проверив его справочную страницу, иman rename
в этом случае верхняя строка будет содержать:источник
file $(which rename)
печатает? (file
Сначала убедитесь, что у вас установлен пакет.)/usr/bin/rename: symbolic link to /etc/alternatives/rename
(file
установлено по умолчанию) На самом деле вам нужно искать символические ссылки,/usr/bin/file-rename: a /usr/bin/perl -w script, ASCII text executable
ноman rename
это более быстрое указание ...--version
; Команда, которую я предложил, должна работать. (/usr/share/doc/rename/changelog.gz на моем компьютере, на котором работает нестабильная--version
версия Debian, указывает, что он был добавлен в версию 0.10 переименования Perl в 2013 году. Я удивлен, что Ubuntu все еще выпускает нечто более старое, чем это, но эта программа фактически не изменила свою функциональность с 2007 года (!), так что все в порядке.)