Внешний диск, не может очистить корзину, rm видит файл, но ls -la не

9

Я очищал музыкальную папку на внешнем диске и нашел каталог, который не могу удалить, что бы я ни пытался.

Если я положу его в мусорное ведро через графический интерфейс

Операция не может быть завершена, поскольку используется элемент «папка».

Если я использую, rm -rfчтобы удалить его через терминал

$ rm -rf folder/
rm: folder/: Directory not empty

Если я использую, ls -laчтобы проверить его содержание

$ ls -la
total 512
drwxrwxrwx  1 user  staff  131072 Jan  3  2017 .
drwxrwxrwx  1 user  staff  131072 Jan  3  2017 ..

Если я использую rm -i *в папке

$ rm -i *
rm: 03 - Ēlusion.mp3: No such file or directory

Если я использую, sudo lsof +D folder/чтобы проверить, открыты ли какие-либо файлы

При выходе из программы ничего не возвращается.

Если я использую Дисковую утилиту для восстановления (первой помощи) диска и тома

Проверка работоспособности прошла, поэтому ремонт не был начат.

Если я перезагружаю macOS

Проблема сохраняется.

Дополнительная информация:

  • Я могу переместить папку на диске, но не на другой диск.

  • Я могу переименовать папку.

  • ls -i *.mp3возвращается ls: 03 - Ēlusion.mp3: No such file or directory, так же, как rm -i *.mp3.

  • Файл не отображается в Finder, это сбивает с толку, независимо от того, какая проблема с отображением имени файла может возникнуть у Терминала (я всегда настраивал его на использование Unicode - UTF-8), я думаю, что в игре больше силы.

В ответ на вопросы, нет, ls -ibничего не возвращает.

$ ls -i
$ ls -ib
$ ls -laib
total 512
2762318 drwxrwxrwx  1 user  staff  131072 Jan  3  2017 .
2685260 drwxrwxrwx  1 user  staff  131072 Jan  3  2017 ..

Так что, видимо, в этом что-то есть, но он ls -laне мог этого увидеть, в то время rm -iкак странно с именем файла?

get info через контекстное меню GUI подтвердил, что в папке есть 1 элемент, но с нулевым байтом, и, конечно, не отображается в Finder.

Я не уверен, что делать на этом этапе. Помощь очень ценится!

(Использование 10.13.4 + ExFAT на внешнем диске)

bitinn
источник
1
Рассматривали ли вы резервное копирование всего, что вы хотите - возможно, уже скопировали в любом случае ... затем полностью переформатировали этот диск, чтобы начать все сначала?
Солнечный Майк
ls -bПоказывает ли файл? Если это так, вы можете ls -biполучить индекс и следовать приведенному ниже ответу или просто скопировать имя файла в -bвыводе.
Рейд
Я считаю, что основная проблема не с именем файла, ls -bi *.mp3показать тот же результат, как показано в OP.
bitinn

Ответы:

10

Похоже, что проблема вызвана файлом с именем 03 - Ēlusion.mp3, расположенным в каталоге с именем папка .

Поскольку Terminal.app не может отображать диакритические метки в именах файлов - да, это так, но это выходит за рамки предоставления самого простого решения для вас - он скрывает свою ошибку, скрывая имя файла (что-то, что я до сих пор не слышал) ; возможно, изменения Высшей Сьерры в /.file, /.volfs и 64-битные inode? Подождите, не обращайте внимания; ваши изменения в вашем вопросе говорят мне, что я вас неправильно понял.) В любом случае, существование файла известно вместе с иронией утверждение Finder о том, что его не существует. Очевидно, это так. Вот как это изменить:

Сначала определите номер инода файла. В Terminal.app cdперейдите в каталог «папка» и введите следующую команду:ls -i *.mp3

Скопируйте числовую строку индекса, указанную в левом столбце ответа, который будет выглядеть примерно так:

12345678 03 - E ̄lusion.mp3

- и вставьте его в эту команду, которая переименует его в то, что терминал может правильно отобразить:

find . -inum 12345678 -exec mv {} deletemenow \;

- предоставив вам файл «deletemenow» в папке «folder», оба из которых вы можете утилизировать любым способом, который вам больше подходит.

Док Г.
источник
Вау, это ужасно ужасная ошибка.
Хрилис - на забастовке -
2
Я не думаю, что это точно. Терминал может скрывать отдельные символы, которые он не может отобразить, но он не удалит всю строку текста.
duskwuff -неактивно-
1
@duskwuff В любом случае кажется, что имя файла вызывает проблемы, так что это потенциальное решение независимо.
JAB
Извините, но проблема кажется более сложной, чем эта: я пытался $ ls -i *.mp3, она возвращается ls: 03 - Ēlusion.mp3: No such file or directory.
Битин
1
Можете ли вы просто запустить ls -iв каталоге, чтобы предотвратить вмешательство расширения подстановочный знак оболочки?
холме
9

Мне потребовалось много времени, чтобы прийти к этому резюме, но я думаю, что это окончательный ответ.

Причина моей проблемы известна :

OS X является нечетным из-за того, что он нормализует имена файлов и что он использует NFD вместо более распространенного NFC .

Исторически (не так давно, до 10.11 эры) OS X + HFS + применяет форму NFD для всех имен файлов , и вы получите только результат NFD от команд и системных вызовов.

Затем все начинает меняться, в 10.11 некоторые результаты системных вызовов нормализуются к NFC , что делает его встроенным в Windows и Linux, но за счет взлома некоторых программ, ожидающих NFD в OS X.

Но после появления macOS 10.13 + AFPS поведение снова меняется: Apple решает, что она хочет нормализовать NFD при отображении и системных вызовах , но оставить исходные имена файлов как есть (поэтому поддерживаются и NFC, и NFD, но если вы выберете имя файла в Finder или lsрезультат копирования в Terminal, вы получите форму NFD).

Это все замечательно, пока вы не поместите файл с именем файла NFD на внешний диск с помощью exFAT (так как это единственный кросс-macOS / Windows-формат с поддержкой размера файла 4GB +): macOS 10.13 почему-то считает, что ваш файл должен быть в формате NFC, поэтому это прослушалось.

На самом деле, вот быстрый тест, у меня есть папка в Windows на моем диске exFAT с 3 файлами:

введите описание изображения здесь

  • test.mp3
  • Ēlusion.mp3( Ēв NFC)
  • 03 - Ēlusion( Ēв НФД)

(Вы можете скопировать точный Unicode здесь )

Когда я монтирую их на моем macOS, вот что я вижу:

введите описание изображения здесь

и ls -laibрезультат:

$ ls -laib
total 46592
2762318 drwxrwxrwx  1 user  staff    131072 Jan  3  2017 .
2685260 drwxrwxrwx  1 user  staff    131072 Jan  3  2017 ..
1572961 -rwxrwxrwx  1 user  staff  11672464 Aug 23  2014 Ēlusion.mp3
1572871 -rwxrwxrwx  1 user  staff  11672464 Aug 23  2014 test.mp3

Как видите, файл NFC присутствует, но файл NFD отсутствует.

Даже если вы знаете о проблеме NFC / NFD в OS X , вы можете не ожидать, что внешний диск exFAT столкнется с этой проблемой противоположным образом (NFC в порядке, но NFD находится в тяжелом состоянии).

Но что могло заставить мой музыкальный файл использовать имя файла NFD?

  • Первоначально я загружал этот музыкальный файл 10.9.10.10 со старым Mac, который применяет имя файла NFD.
  • В какой-то момент я перенес их на диск Windows + NTFS, который не поддерживает NFC / NFD, поэтому оригинальное имя файла NFD сохраняется.
  • Теперь я хочу переместить этот файл обратно в мою MacOS 10.13 + APFS, используя диск exFAT (exFAT поддерживает то же соглашение UTF-16, что и NTFS).
  • Ад вырвался на свободу.

Я мог бы скопировать файл через сетевой диск или TeamViewer, и это было бы хорошо, но exFAT вызывает эту ошибку в macOS.

Уроки:

  • Имя файла Unicode по-прежнему представляет угрозу.
  • Вам на самом деле нужна Windows / Linux, чтобы решить эту проблему (если ситуация - ваш файл находится на внешнем диске exFAT).
bitinn
источник
@bitlinn: Нажмите на вторую ссылку в моем комментарии, адресованную duskwulff, и попробуйте инструмент нормализации Юникода Apfelstrudel, который вы там найдете. Очень полезно для APFS, бессмысленно с exFAT. Или это...?
Док Г.
1
@DocG. этот вопрос немного сложнее, чем я думал, но я снова обновил свой ответ!
Битин
Да, я думал, что ты мог бы сделать это. См. Мой предыдущий комментарий о Error 36веб-поиске и поиске чего-то вроде «переместить файлы туда и обратно Windows Mac Error 36» для получения дополнительной информации о разделении атрибутов файлов в системах, не являющихся HFS. Это (еще одна) известная проблема именования файлов в MacOS / OS X с момента появления Системы 10.6. Между нормализацией Unicode и разделением атрибутов dot_underscore вы столкнулись с двойной ошибкой. Я сомневаюсь, что команда dot_clean имела шанс.
Док Г.