Удалить файл с нечетным символом в имени файла
Я не могу удалить файл, который является копией резервной копии... Я не помню весь набор символов файловой системы, который он прошел.
Во всяком случае, сегодня вот файл:
nas# ls -al
ls: cannot access Sécurité: No such file or directory
total 32
drwx------ 4 sambacam sambacam 20480 Jun 5 01:38 .
drwxr-xr-x 3 sambacam sambacam 12288 Jun 5 01:38 ..
d????????? ? ? ? ? ? S??curit??
nas# cd S*
cd: 13: can't cd to Sécurité
nas# rm "Sécurité"
rm: cannot remove `S\303\251curit\303\251': No such file or directory
nas# rm S*
rm: cannot remove `S\303\251curit\303\251': No such file or directory
nas#
Я даже попытался написать код на Python без успеха:
nas# python
Python 2.5.2 (r252:60911, Jan 24 2010, 20:48:41)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> d=os.listdir('.')
>>> d
['S\xc3\xa9curit\xc3\xa9']
>>> d[0]
'S\xc3\xa9curit\xc3\xa9'
>>> os.remove(d[0])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: 'S\xc3\xa9curit\xc3\xa9'
>>>
Любая идея?
Я уже запустил fsck для проверки несоответствий.
2 ответа
Я думаю, что у вас проблемы хуже:
d????????? ? ? ? ? ? S??curit??
Это означает, что ls(1)
Не удалось найти разрешения, количество ссылок, владельца, группу, размер или время вашего файла. Все, что у него есть, это имя файла.
Это может произойти, если структура каталога указывает на файл, но индекс для этого файла пропал. Я бы надеялся fsck
найдет его и очистит запись каталога, но если этого не произошло, вы не сможете очистить этот каталог в этой файловой системе. (Вы можете переместить его куда угодно, даже в /lost+found
и не надоедать ему снова...)
Возможно, debugfs(8)
инструмент будет полезен в обучении больше?
Вы пробовали использовать трюк с номером инода? Делать:
ls -ilb
Первый номер в этом списке - номер индекса. -b
переключатель делает ls
Не пытайтесь печатать непечатные символы. Получив номер индекса из файла, попробуйте:
find . -inum the_number_from_above -exec rm -i {} \;
(Кстати: это кодировка UTF-8.)
Я не уверен, что это будет работать, хотя Дело в том, что ls
не находит метаданные файла (метки времени и биты прав доступа) выглядит как повреждение файловой системы.