Безопасное удаление каталога только в том случае, если оно не является точкой монтирования

К сожалению, меня вынуждают работать с программным обеспечением, которое обрабатывает автоматически установку и размонтирование сетевого уровня очень плохо; у него есть раздражающая тенденция покидать каталог, где была точка монтирования, но не может справиться должным образом с тем, что происходит при установке громкости позже (он должен быть убран, но часто этого не делает).

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

  • Как я могу завершить работу после размонтирования USB-устройства из командной строки?
  • Как найти тип файла img, чтобы он мог быть установлен
  • Почему вывод поиска отсортирован в Cygwin, но не в Solaris?
  • Как переопределить rw-r-r-root / wheel для всех файлов в каталоге?
  • Сжатие и удаление исходного каталога с ограниченным хранилищем
  • Что означает «точка монтирования» в установщике Linux?
  • Поэтому я хочу, чтобы удалить каталог, но только если он не является точкой монтирования (поскольку я не хочу случайно удалять содержимое тома).

    Теперь я могу получить идентификатор устройства в каталоге и сравнить его с идентификатором устройства root достаточно легко, но есть вероятность состояния гонки, если я использую такое сравнение, т. Е. Если уровень устанавливается между проверкой идентификаторов устройств и вызов rm -r /mnt/point .

    Есть ли альтернативы? Я был заинтригован возможностью использования опции -xdev команды -xdev , но я не уверен, как бы я мог предоставить точку сравнения, так как find /mnt/point -xdev не будет работать, поскольку цель и ее содержимое одно и то же устройство.

    Кроме того, использование rmdir в предположении, что оставшаяся папка всегда будет пустой, кажется ненадежной, так как на некоторых системах точка монтирования может иметь файл внутри; Например, macOS оставляет .autodiskmounted файл .autodiskmounted . Хотя я мог бы создавать список таких случаев и обрабатывать их, было бы неплохо (и, надеюсь, полезно другим) иметь более общее решение для будущих ссылок, если такое возможно.

  • Предотвращение повреждения файлов
  • Что случилось с этим «найти все файлы vim swap и удалить их с помощью команды подтверждения»?
  • Как далеко вы можете пойти с rm -rf / как root
  • Почему удаление каталогов генерирует сообщения об ошибках с помощью find -exec?
  • Как увеличить размер rootfs?
  • Есть ли инструмент для визуализации карты распределения файловой системы в Linux?
  • 3 Solutions collect form web for “Безопасное удаление каталога только в том случае, если оно не является точкой монтирования”

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

     $ sudo mv /mnt /mnt.old mv: cannot move '/mnt' to '/mnt.old': Device or resource busy 

    Если это обычный каталог, вы можете переименовать его.

     $ sudo mv /mnt /mnt.old 

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

    Если вы используете Linux

    Вы можете проверить, является ли каталог точкой монтирования с помощью точки mountpoint .

    Чтобы избежать появления / исчезновения точки монтирования между тестом и rm -r , вам нужно запустить сценарий в отдельном пространстве имен монтирования с частным поддеревом (mounts не распространяются из / в новое пространство имен). Это может быть достигнуто с помощью unshare .

     unshare -m --propagation private -- "<delete script>" 

    Все в одном скрипте:

     #!/bin/sh unshare -m --propagation private -- sh -e <<EOF if ! mountpoint -q "<path>"; then rm -r "<path>" fi EOF 

    Вы не можете rmdir каталог, который не пуст, или тот, который является точкой монтирования. Таким образом, это удовлетворит ваши требования:

     rm -f mountpoint/.autodiskmounted # MacOS cookie rmdir mountpoint 2>/dev/null 

    Если вы работаете в скрипте с выходом из набора ошибок , вы можете использовать rmdir ... || true rmdir ... || true . (Обратите внимание, что --ignore-fail-on-non-empty малопригодно, потому что мы попытаемся удалить непонятную ошибку при попытке удалить точку монтирования.)

    Я должен указать, что у меня нет доступа к системе Mac, поэтому я не могу проверить, присутствует ли файл .autodiskmounted когда файловая система действительно смонтирована, или является ли это заполнитель, когда файловая система размонтирована.

    Linux и Unix - лучшая ОС в мире.