Предотвратить rmdir -p от прохождения выше определенного каталога


1

Я взломал этот скрипт вместе с rsyncнекоторыми файлами ssh. --remove-source-filesВариант , rsyncкажется , удалить файлы , он передает, что это то , что я хочу. Тем не менее, я также хочу, чтобы каталоги, в которые помещены эти файлы, также исчезли.

Текущая часть findкоманды -exec rmdir -p {} ;пытается удалить родительский каталог (в данном случае /srv/torrents), но завершается неудачно, потому что у нее нет необходимых разрешений. То, что я хотел бы сделать, это прекратить обходить rmdirкаталог, findв котором запущен каталог , или найти другое решение, чтобы избавиться от всех пустых папок. Я думал об использовании какой-то петли findи работал rmdirбез -pвыключателя, но я думал, что это не сработает.

По сути, есть ли альтернативный способ удалить все пустые каталоги в родительском каталоге?

#!/bin/bash

HOST='<hostname>'
USER='<username>'
DIR='<destination directory>'
SOURCE='/srv/torrents/'

rsync -e "ssh -l $USER" --remove-source-files -h -4 -r --stats -m --progress -i $SOURCE $HOST:$DIR
find $SOURCE -mindepth 1 -type d -empty -prune -exec rmdir -p \{\} \;

Ответы:


1

Вы можете использовать тот факт, что rmdirне удалит непустую директорию:

rmdir {,.}?*/ 2>/dev/null

или, если ваша версия rmdirимеет опцию:

rmdir --ignore-fail-on-non-empty {,.}?*/

Странно выглядящий глобус расширяется и включает обычные каталоги и скрытые каталоги, но исключает .и ...

Вам не нужно использовать, findесли вам не нужно попасть в каталоги ниже текущего уровня.

Редактировать:

Пытаться:

find -type d -empty -delete

Это делает поиск в глубину и удаляет все пустые вложенные каталоги.


@Dennis: Но это не удалит пустые каталоги под текущим уровнем (например, если ./foo/bar/baz/все пустые папки, он не удалит их.) Мне нужно что-то, что попадет в каталоги ниже текущего уровня, поэтому я и использую находить.
Белка

@thepurplepixel: см. мое редактирование.
Деннис Уильямсон

Точно так же, как указывают всем будущим людям, читающим этот вопрос, что отредактированная команда также требует -mindepth 1параметр, чтобы не удалять родительский каталог.
Белка

@thepurplepixel: Это, вероятно, безопаснее, но я только что проверил это, и он не удалил родительский (текущий) каталог. mkdir test; cd test; mkdir sub; find -type d -empty -print -delete; cd ..; ls -ld test; ls -lR test, Все еще там ("суб" ушел). Директория «test» не пуста до тех пор, пока ее содержимое не будет удалено (сначала в глубину). Теперь сделайте cd test; find -type d -empty -print -delete; cd ..; ls -ld test; ls -lR test(перезапустите его, когда «тест» уже пуст). Все еще там.
Деннис Уильямсон

@Dennis: Это может отличаться для меня, потому что я указываю определенный каталог для findзапуска ( find $DIR -mindepth 1 -type d -empty -delete) ... кто знает? Кажется, это работает для меня, и это главное! :)
Squircle

0

Вы также можете сделать

find $SOURCE -mindepth 1 -type d -empty -prune -print0 | xargs -0 rm -rf

@MrShunz: К сожалению, это тоже не работает. Это имеет тот же эффект, что и ответ Денниса Уильямсона. Даже если вы запускаете его два или три раза, кажется, что он имеет глубину не более двух каталогов. Спасибо хоть.
Белка
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.