Когда я использую
find /home/user/parentdir -type d -empty -delete
он рекурсивно ищет пустые подпапки внутри /home/user/parentdir
и удаляет их. Но если /home/user/parentdir
он также пуст, он также удаляет parentdir
папку, что для меня нежелательно.
Я хочу сохранить это parentdir
в rsync
некоторых файлах для резервного копирования или в облаке. После обработки мне нужно удалить пустые папки, но кажется, что непроизводительно воссоздавать parentdir
каждый раз.
Любые предложения, чтобы сохранить parentdir
? Я думал о создании .nocopy
файла внутри него и исключить его из rsync
, но выглядит излишним. Есть ли более элегантный способ?
command-line
bash
rsync
find
тротил
источник
источник
-mindepth 1
?Ответы:
Просто делай
find /home/user/parentdir -mindepth 1 -type d -empty -delete
.Посмотрите:
find /home/user/parentdir/*
В ответе AmourK в Нежелательно , когда есть много файлов , и это усложненное.источник
Добавляя
/*
в конецparentdir
, вы выполняете действие со всеми подкаталогами parentdir, а не надparentdir
самим собой. И поэтому точно так же/home/user/
не удаляется в старой команде,parentdir
не будет удаляться в команде ниже.*
называется оператором glob и соответствует любой строке символов.find /home/user/parentdir/* -type d -empty -delete
источник
/home/user/parentdir/
, размер расширенного глобуса может превышатьARG_MAX
, что приводит к слишком длинной ошибке в списке аргументов . Вы можете уменьшить вероятность этого, изменив глобус*/
так, чтобы он совпадал только с каталогами./tmp
создание, создание подкаталога, распаковку сжатого архива, запуск установщика и очистку. Мысль новичкаrm -rf /tmp/foo-install
была правильным способом сделать это, и, как опытная рука сказала «Неееееееет» в своем лучшем впечатлении Дарта-Вейдера в конце Эпизода-III, новичок выяснил, как близко / и клавиши Enter были друг для друга. Мы должны были загрузиться с диска восстановления программного обеспечения резервного копирования и перезагрузить весь сервер с ленты.если у вас установлен php-cli,
источник
foreach (RecursiveIteratorIterator(RecursiveDirectoryIterator($dir)) as $p) if (empty($skipped)) $skipped = TRUE; elseif ($p->isDir()) @rmdir($p->getPathname());
или что-то подобное.$skipped
заботится о пропуске первого,@rmdir
пытается удалить dir и молча (это @) завершается неудачей, если не пустой.Когда вам нужен только один уровень (оставление родительской папки, но удаление пустых дочерних папок), использовать простой прием
rmdir
.Удаляет все пустые подпапки, но печатает только ошибку для файлов и непустых папок.
Это не работает рекурсивно, но, зная структуру вашей папки, это может быть самый быстрый способ сделать что-то вроде
Преимущество: Легко запомнить, быстро печатать, мало возможностей для выбора неправильного параметра.
Недостаток: менее гибкий, возможно много сообщений об ошибках в вашем терминале.
источник