Когда я использую
find /home/user/parentdir -type d -empty -delete
, он рекурсивно ищет пустые подпапки внутри /home/user/parentdir
и удаляет их. Но если /home/user/parentdir
также пусто, он также удаляет папку parentdir
, что для меня нежелательно.
Я хочу сохранить эти parentdir
- rsync
некоторые файлы для резервного копирования или в облаке. После обработки мне нужно удалить пустые папки, но, кажется, непродуктивно каждый раз воссоздавать parentdir
.
Есть предложения оставить parentdir
? Я думал о создании файла .nocopy
внутри него и исключении его из rsync
, но выглядит как излишнее. Есть ли более элегантный способ?
Просто сделайте 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 нежелательный, когда существует много файлов, и он является сверхсложным.
Путем добавления /*
в конец parentdir
, Вы выполняете действие со всем subdirs parentdir, а не на parentdir
самостоятельно. И так таким же образом /home/user/
не удален в старой команде, parentdir
не будет не быть удаленным в команде ниже. *
назван оператором шарика, и он соответствует любой строке символов.
find /home/user/parentdir/* -type d -empty -delete
если у Вас есть установленный 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)));'
Когда Вам только нужен один уровень (оставляющий родительскую папку, но удаляющий пустые дочерние папки), легкий прием должен использовать 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
Преимущество: Легкий помнить, быстро ввести, мало потенциала для выбора неправильного параметра.
Недостаток: менее гибкий, возможно много сообщений об ошибках в Вашем терминале.