2

Я пытаюсь удалить мои пустые каталоги на моем Synology NAS (DS415+).

Я старался:

find . -type d | xargs rmdir

Но проблема в том, что у меня есть директории с пробелами в именах типа «привет (2012)». И аргумент «-empty» не поддерживается в ядрах Synology.

Есть ли у вас какие-либо идеи?

2 ответа2

1

xargs(1) разделяется не в пробелах, а в новых строках .

Если у вас нет каталогов с символами новой строки в их имени, это будет работать.

find . -type d -exec rmdir {} +

  =>  rmdir ./dir1 ./dir1/subdir1 ./dir1/subdir2 ./dir2 ...

Но мы удаляем родителей до детей ... Поэтому вместо этого мы хотим:

find . -depth -type d -exec rmdir {} +

  =>  rmdir ./dir1/subdir1 ./dir1/subdir2 ./dir1 ./dir2 ...
1

Возможно, я вас неправильно понял, но, похоже, вы работаете с оболочкой POSIX .

Вы можете сделать это с помощью awk (gawk). Поскольку каждый пустой каталог по умолчанию содержит только 2 файла (. И ..), вы можете использовать [ $(wc -l <<< $(ls -as $DIR)) -ne 2 ] качестве условия пустоты папки.

$ find . -type d | awk '{print "[ $(wc -l <<< $(ls -a \"" $i "\")) -eq 2 ] && rm -rf \"" $0 "\""}'

Вот что я получаю из проверенного каталога:

[ $(wc -l <<< $(ls -a ".")) -eq 2 ] && rm -rf "."
[ $(wc -l <<< $(ls -a "./skda  askd ()")) -eq 2 ] && rm -rf "./skda  askd ()"
[ $(wc -l <<< $(ls -a "./skda  askd () 2")) -eq 2 ] && rm -rf "./skda  askd () 2"

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

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