Почему я получаю сообщение «Каталог не пуст» с помощью «rm -rf»?

Добавьте -a для принудительной печати совпадений, даже если они кажутся непечатаемыми.

Добавьте -o и он будет печатать только "EXTH" вместо строки. Это также изменит смещение байтов - будет выведено смещение "EXTH" вместо смещения начала строки, содержащей "EXTH". Если файл на самом деле не состоит из строк, это будет улучшением!

Или используйте perl -n0777e 'print pos()-length($&),"\n" while /EXTH/g' для замены зависимости от GNU grep на зависимость от чего-то более универсального... (Предупреждение: засовывает весь файл в память, может быть неприятно для больших файлов)

2
14.03.2019, 19:00
2 ответа
Действия

rmпри работе с несколькими файлами или каталогами не являются атомарными. В данном случае это имеет значение, потому что rm -rвыполняет поиск файлов и каталогов снизу вверх -, удаляя их из листьев в корень запрошенного пути. Это делается с помощью unlinkи rmdirдо тех пор, пока ничего не останется, а затем rmdirявляется конечным каталогом.

Эти действия происходят последовательно, поэтому, если до выдачи rmdirсоздается больше файлов, вы получаете ответENOTEMPTY("Каталог не пуст" ).

Более чем вероятно, что ваш скрипт или другой процесс, работающий в системе, создает вещи одновременно с rm -rf.Возможно, вам следует подумать о:

  1. Делать это синхронно, а не асинхронно или
  2. Повторите попытку rm -rf, если она не удалась и возвращает ENOTEMPTY (, хотя тогда другое приложение может завершиться ошибкой, поскольку каталог был удален из-под него)

Вы можете найти другое приложение, которое создает файлы, используя что-то вроде fanotifyили скрипт eBPF, например opensnoopиз BCC . inotifyтакже может быть полезным, но, к сожалению, он не включает процесс создания файлов в свои выходные данные.

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

4
27.01.2020, 22:02

Оказывается, мой предыдущий open $dirвызов запускал один из подкаталогов каталога, который я хочу удалить, в macOS Finder (настольном приложении файлового браузера ).

Похоже, что macOS выдает эту загадочную ошибкуDirectory not empty(ENOEMPTY ), если есть процесс, который блокирует один из файлов/каталогов в том каталоге, который вы хотите удалить.

1
27.01.2020, 22:02

Теги

Похожие вопросы