Предотвратить 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 \{\} \;
squircle
источник

Ответы:

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: К сожалению, это тоже не работает. Это имеет тот же эффект, что и ответ Денниса Уильямсона. Даже если вы запускаете его два или три раза, кажется, что он имеет глубину не более двух каталогов. Спасибо хоть.
Белка