Рекурсивное удаление пустых каталогов с исключением точечных файлов/каталогов?

"потенциальные угощения"? Как что? Бекон? Конфеты? Если серьезно, то я вижу, что голосование против, но вопрос интересный. Конечно, ограничение физического доступа является частью процесса обеспечения безопасности. Что касается самой системы, вы можете удалить все порты с материнской платы, кроме жесткого диска и разъемов питания, после того, как вы установили операционную систему и настроили BIOS на включение системы после потери питания и игнорирование всех сообщений об ошибках. о пропавшей клавиатуре. Заварить корпус на ключ. Теперь у вас есть что-то вроде шредингера * nix Box! Однако, если коробка взаимодействует с чем-либо или контролирует что-либо, она не закрыта полностью снаружи. Бессмысленный эксперимент или нет, но это интересное упражнение для мозгового штурма. С практической точки зрения, в области информационной безопасности люди действительно используют машины с воздушными зазорами по разным причинам; создание ключей, хранение конфиденциальных данных, сертификатов, написание сообщений, которые покидают компьютер только в зашифрованном виде через устройства хранения, а не через проводные или беспроводные сети.

1
28.10.2018, 05:40
2 ответа

Это немного усложняется, но вы можете объединить некоторые findтесты, а именно:

  • начать с нужного каталога(/path/to/dir)
  • начните снизу вверх (-depth), чтобы очистить каталоги-кандидаты перед рассмотрением их родительских каталогов
  • учитывать только каталоги(-type d)
  • для каждого из указанных выше совпадений (по одному ), выполнить оболочку bash, которая :
    • устанавливает параметр оболочки nullglob, чтобы убедиться, что параметр оболочки dotglob не установлен
    • использует глобус оболочки $1/*для установки позиционных параметров на количество совпадающих файлов (и/или каталогов )в совпадающем каталоге --, отмечая, что удаление dotglob сообщает bash не количество точек -файлов (или точек -каталогов )в расширении, и что опция nullglob позволит глобусу расширяться до ничего , если совпадений нет вообще.
    • если количество результирующих файлов/каталогов равно нулю, вернуть "успех"
  • для любых каталогов, прошедших вышеуказанный тест, выполните rm -rдля них столько, сколько поместится в команду rmза раз(+).

Подведение итогов:

find /path/to/dir -depth -type d \
  -exec bash -c \
     'shopt -s nullglob; shopt -u dotglob; set -- $1/*; test "$#" -eq 0' find-sh {} \; \
  -exec rm -r {} +

Hat -подсказка к ответу Stéphane find/exec здесь за хорошую основу для начала этого ответа.

Для создания тестовой -кровати:

mkdir tmp
cd tmp
mkdir dir{1..3}
touch dir1/.hidden
touch dir2/foo
touch dir3/bar
0
28.01.2020, 00:24

rmdir не удалит не -пустой каталог, поэтому вы можете сделать:

find. -type d \! -name '.*' -depth -exec rmdir -v --ignore-fail-on-non-empty {} \;

(где --ignore-fail-on-non-emptyпросто сообщения об ошибках...)

0
28.01.2020, 00:24

Теги

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