Недавно мне нужно было удалить большое количество файлов (более 1 миллиона), и я прочитал, что делает:
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Был один из самых оптимизированных способов сделать это, и я могу поручиться, что это быстрее, чем rm -rf
.
Я не эксперт в этом вопросе, но из моего понимания причина производительности rsync связана с тем, как она выводит список файлов (я полагаю, LIFO вместо FIFO). Теперь проблема в том, что мне также нужно эффективно перемещать большое количество файлов. Немного поиска, я нашел это:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination
Хотя это удаляет все переместились файлы в ~/source
этих каталогах остаются там. Поскольку у меня есть структура каталогов, похожая на «циклический перебор», число files/directories
очень близко к 1, поэтому я вынужден снова выполнить первую команду, чтобы полностью избавиться от каталога:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Стрит mv
закончится практически мгновенно, но в моем ~/destination
каталоге есть файлы, которые следует хранить, поэтому mv
это не вариант. Я нашел параметры --prune-empty-dirs
и --force
rsync, но ни один из них не работает так, как я ожидал:
--force force deletion of directories even if not empty
--prune-empty-dirs prune empty directory chains from the file-list
--remove-source-files sender removes synchronized files (non-dirs)
Есть ли способ имитировать движение с rsync за один раз?
Ответы:
Я нашел эту тему в stackoverflow под названием: Удаление папок с помощью rsync «move»? , который задает по существу тот же вопрос. В одном из ответов предлагалось выполнить команды
rsync
in 2, поскольку оказалось, что нет ни одной команды, которая могла бы выполнить перемещение / удаление файлов и исходных каталогов.В качестве альтернативы вы можете сделать это с помощью этой команды:
Не идеально, но делает работу.
источник
rsync
для удаления каталогов не является правильным, и всегда есть опасностьrm -rf
. Я бы порекомендовал 2-й шаг:find source/ -d -type d -exec rmdir {} \;
-delete
и--remove-source-files
в одной команде rsync (приведенные выше примеры хороши, это тангенциально). Если вы прервете, а затем повторите то, что я описываю, вы потеряете переданные файлы. Что я делал раньше :(find
, я предпочитаю следующее:find source/ -type d -empty -delete
это дает мне странное чувство уверенности в том, что это не будет просто затирать все.От комментария Зани до ответа СЛМ ( Перемещение файлов и удаление каталогов с помощью rsync? ) Я бы порекомендовал эти 2 команды в качестве ответа:
Преимущество в том, что, как сказал Зани, использование rm -rf все еще сопряжено с некоторой опасностью, если вы не понимаете это правильно или для новичков.
Я добавил 2 параметра, -depth и -empty, и хотя я не уверен, действительно ли это необходимо, вторая команда становится более переносимой для других ситуаций и даже более безопасной (она по-прежнему работает правильно, если некоторые каталоги не пусты и начинает удаление из самой глубокой точки в дереве каталогов)
источник
-delete
вместо-exec rmdir {} \;
?Это делает работу за один шаг. Обратите внимание на трейлинг / косую черту / на пути источника и цели.
Я повторяю предупреждение от user7000 не использовать
--delete
и--remove-source-files
вместе в одном вызовеrsync
. Если операция завершится неудачно или прервется, и тот же вызов будет повторен, вы потеряете данные. В случае каких-либо сомнений используйте--dry-run
опцию, чтобы увидеть, что будет сделано.источник
-ruval
кажется излишним.-a
эквивалентно-rlptgoD
, который включает в себя как-r
и-l
.