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
Каждая программа командной строки (в идеале) предназначена для выполнения определенной задачи, и вы должны склеить несколько вместе для выполнения более сложных задач.