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 \{\} \;

2 ответа2

1

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

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

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

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

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

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

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

Пытаться:

find -type d -empty -delete

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

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .