Удалить пустые подпапки, сохранить родительскую папку

Когда я использую

find /home/user/parentdir -type d -empty -delete

, он рекурсивно ищет пустые подпапки внутри /home/user/parentdir и удаляет их. Но если /home/user/parentdir также пусто, он также удаляет папку parentdir, что для меня нежелательно.

Я хочу сохранить эти parentdir - rsync некоторые файлы для резервного копирования или в облаке. После обработки мне нужно удалить пустые папки, но, кажется, непродуктивно каждый раз воссоздавать parentdir.

Есть предложения оставить parentdir? Я думал о создании файла .nocopy внутри него и исключении его из rsync, но выглядит как излишнее. Есть ли более элегантный способ?

15
задан 16 September 2019 в 14:46

4 ответа

Просто сделайте find /home/user/parentdir -mindepth 1 -type d -empty -delete.

Взгляд:

$ mkdir -p test1/test2
$ find test1 -type d
test1
test1/test2
$ find test1 -mindepth 1  -type d
test1/test2

find /home/user/parentdir/* в ответе AmourK нежелательный, когда существует много файлов, и он является сверхсложным.

25
ответ дан 23 November 2019 в 02:41

Путем добавления /* в конец parentdir, Вы выполняете действие со всем subdirs parentdir, а не на parentdir самостоятельно. И так таким же образом /home/user/ не удален в старой команде, parentdir не будет не быть удаленным в команде ниже. * назван оператором шарика, и он соответствует любой строке символов.

find /home/user/parentdir/* -type d -empty -delete

15
ответ дан 23 November 2019 в 02:41

если у Вас есть установленный php-cli,

printf %s $(pwd) | php -r 'function f(string $dir){var_dump($dir);$dir.=DIRECTORY_SEPARATOR;foreach(glob("$dir*",GLOB_ONLYDIR) as $d){f($d);}global $original;if(substr($dir,0,-strlen(DIRECTORY_SEPARATOR))!==$original && empty(glob("$dir*"))){rmdir($dir);}}f(($original=stream_get_contents(STDIN)));'
0
ответ дан 23 November 2019 в 02:41

Когда Вам только нужен один уровень (оставляющий родительскую папку, но удаляющий пустые дочерние папки), легкий прием должен использовать rmdir.

rmdir parent/*

Удаляет все пустые подпапки, но только печатает ошибку для файлов и непустых папок.

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

rmdir parent/*/*/* # deletes parent/a/b/c when empty
rmdir parent/*/* # deletes parent/a/b when it is now empty
rmdir parent/* # deletes parent/a when it is now empty

Преимущество: Легкий помнить, быстро ввести, мало потенциала для выбора неправильного параметра.
Недостаток: менее гибкий, возможно много сообщений об ошибках в Вашем терминале.

0
ответ дан 23 November 2019 в 02:41

Другие вопросы по тегам:

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