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

8

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

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

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

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

ylluminate
источник
Какова ваша причина не использовать mv?
Нильс
1
Разные объемы и мне нужно сохранить все атрибуты, включая время.
Иллюминат
1
То же самое нужно здесь unix.stackexchange.com/q/78375/3858 .
Аликс Аксель
1
Я очень удивлен, что у rsync нет такой возможности, особенно когда это происходит на стороне назначения. Я заканчиваю тем, что делаюfind . -type d -empty | xargs rmdir -p
Шридхар Сарнобат
Вы знаете, @ Sridhar-Sarnobat, я не могу не задаться вопросом, есть ли способ передать результаты rsyncсеанса в список, который затем обрабатывается в соответствии с процессом, который затем очищает его ... Хм.
Иллюминат

Ответы:

4

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

rsync -av --ignore-existing --remove-source-files source/ destination/ && \
rsync -av --delete `mktemp -d`/ source/ && rmdir source/
Аликс Аксель
источник
5

Использование « rm -rf » имеет неотъемлемое условие гонки, а именно вы можете удалить файлы, которые были только что созданы между вызовами rsync и rm .

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

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

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

Рауль Салинас-Монтеагудо
источник
Обратите внимание, что вам, видимо, может потребоваться добавить -depthOSX или другие.
Чарли
3

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

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

find . -type d -empty -delete
lp_
источник
Да, слава Богу, что я пуст, что я обнаружил только недавно, и я стал очень часто его использовать.
Шридхар Сарнобат
2

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

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

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

Грегори МУССАТ
источник
2
Я думаю ты прав. Я считаю, что в конечном итоге мне придется сначала углубиться до самого дна, поскольку я не могу попасться, просто двигаясь, как обычно делает rsync. Наверное, нужно использовать find -depth. Не могли бы вы предложить быстрый алгоритмический подход к тому, чтобы добраться до дна стека dir, используя rsync, как вы заметили, а затем снова вернуться к дереву?
Иллюминат