Назад | Перейти на главную страницу

Как удалить пустые исходные каталоги при перемещении папок с помощью rsync?

rsync можно уговорить перемещать папки так же, как и традиционные mv со следующими параметрами:

rsync -axvvES --remove-source-files source_directory /destination/

Однако одна вещь, которую я пока не могу сделать, - это удалить исходные каталоги. В --remove-source-files flag делает именно это, удаляет исходные файлы, но не каталоги с исходными текстами. Я бы хотел, чтобы --remove-source-directories flag, но его нет.

Как мне с этим справиться? Полагаю, я могу просто выпустить rm -fr после переезда, однако, я бы предпочел сохранить всю процедуру в одном процессе, чтобы не допустить ошибок.

С помощью "rm -rf"имеет врожденное состояние гонки, вы можете удалить файлы, которые только что были созданы между rsync и rm призывы.

Я предпочитаю использовать:

rsync --remove-source-files -a server:incoming/ incoming/ && 
ssh server find incoming -type d -delete

Это НЕ удалит каталоги, если они не пусты.

Я не нашел команды, которая бы делала это за один раз, но поскольку rsync по-прежнему работает лучше, чем rm -rf (особенно если у вас очень большое количество каталогов) вот две команды rsync, которые выполняют "шаг":

rsync -av --ignore-existing --remove-source-files source/ destination/ && \
rsync -av --delete `mktemp -d`/ source/ && rmdir source/

Я оказался в похожей ситуации. Я хотел избежать rm -rf, зная, что rsync не удалось скопировать некоторые файлы, и я не хотел их терять.

Чтобы просто удалить пустые каталоги, я нашел этот самый удобный (из sourcedir):

find . -type d -empty -delete

Почему бы просто не добавить rm -rf source_directory после вашего rsync?

rsync -axvvES --remove-source-files source_directory /destination/ && rm -rf source_directory

Каждая программа командной строки (в идеале) предназначена для выполнения определенной задачи, и вы должны склеить несколько вместе для выполнения более сложных задач.