На моем внешнем жестком диске две директории, Fun. и Complex_ , где _ является пробелом. Я не могу очистить свой мусор или удалить их с помощью rm -rf и я хочу. Ни один из них не появился в Finder на OSX, и я не помню, были ли они в Dolphin на Linux. Но они появляются в Bash.

rm и mv возвращает No such file or directory . Содержащие папки могут быть перемещены и принести специальные каталоги с ними, но они не могут быть удалены.

Почему ls может обнаружить файлы, а rm и mv не могут? Как я могу их исправить? Я использую \_ для сложного файла. (_ - это пробел).

редактировать

Символы не должны быть проблемой. Я сделал "тест". и "тест", и я без проблем удалил их, используя кавычки. Но эти каталоги все еще не могут быть удалены. Там должно быть что-то очень низкий уровень не так с самими файлами

sagan:Math ptwales$ ls
Complex 
sagan:Math ptwales$ ls -i
ls: Complex : No such file or directory
sagan:Math ptwales$ ls -idF *
ls: Complex : No such file or directory
sagan:Math ptwales$ find . -name * -print0
find: ./Complex : No such file or directory
sagan:Math ptwales$ 

Те же результаты с Fun. Я предполагаю, что родительские каталоги имеют ссылки на файлы и знают их имена, но файлы просто не существуют или как-то повреждены.

Внешний диск в формате exFAT. Это будет актуально?

4 ответа4

5

rm и mv также могут нормально определять каталоги, но если вы наберете: rm file то оболочка проигнорирует пробел.

Есть несколько вещей, которые вы можете сделать, чтобы обойти это. Самый простой - это заключить имя файла в кавычки. Другое решение состоит в том, чтобы избежать специального символа, например, с обратной косой чертой

Пример:

touch "testfile "

host:/home/username/test>ls -al
total 12
drwx------   2 hennes  users  4096 Sep 26 02:44 .
drwxr-xr-x  34 hennes  users  8192 Sep 26 01:39 ..
-rw-------   1 hennes  users     0 Sep 26 02:44 testfile

Теперь, чтобы удалить их, либо:

rm "testfile " , или

rm testfile\ (обратите внимание на пробел после обратной косой черты)


Что касается имен файлов, оканчивающихся на точку. Я не могу воспроизвести проблему. Вы уверены, что он заканчивается точкой, а не каким-то другим специальным символом?

toad:/home/hennes/test>bash --version
GNU bash, version 4.1.10(1)-release (amd64-portbld-freebsd7.3)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

toad:/home/hennes/test>touch Fun.

toad:/home/hennes/test>ls
Fun.

toad:/home/hennes/test>rm Fun.
toad:/home/hennes/test>ls
toad:/home/hennes/test>

Если это другой символ, чем точка, прочитайте разделитель внутренних файлов в bash. Вы можете установить его на что-то другое или просто использовать команды sunch как find с -print0. (Пример find /path/to/search-name 'SomeFilePattern*' -print0 | some_command)

1

Я написал ответ об этом на довольно похожий вопрос о сбое сервера. Посылка немного отличается, но в основном тот же ответ работает.

Вы можете комбинировать ls -i (или stat который также печатает номер инода) и find -inum . Это хорошо работает для небольшого числа файлов, где по какой-то причине прямое подстановочное подстановка нежелательно. Приведенный ниже пример адаптирован к каталогам, тогда как ответ о сбое сервера относится к файлам, но принцип тот же: использование номера инода для идентификации записи каталога, с которой нужно что-то делать.

Например:

~$ ls -idF myweirddir
183435818 myweirddir/
~$ find . -inum 183435818 -exec mv -v '{}' 'delete-me' ';'
`./myweirddir' -> `./delete-me'
~$ ls -lA delete-me/
... check the contents ...
~$ rm -rf delete-me
~$

Этот ответ также закончен в случае сбоя сервера с небольшими отличиями и альтернативным вариантом с прямой заменой процесса с использованием find и stat, что, вероятно, не очень применимо в вашей ситуации. Если вам нравится ответ здесь, подумайте также об отказе при отказе сервера.

1

Это похоже на поврежденную файловую систему или ошибочную реализацию файловой системы.

К сожалению, файловая система exFAT плохо поддерживается в системах, отличных от Microsoft. Если у вас есть возможность использовать другую файловую систему, учтите это.

Пожалуйста, проверьте целостность файловой системы. В Linux вы можете проверить целостность exFAT, запустив exfatfsck . К сожалению, эта утилита не сможет восстановить файловую систему. В Windows (XP с обновлением KB955704, Vista SP1 или новее) вы можете использовать chkdsk который может как проверять, так и восстанавливать файловую систему.

-1

Когда есть файл с каким-то странным именем, которое вы не можете напечатать, вы можете использовать функцию bash select:

select f in * .*; do rm -i $f; done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .