папки слияния Linux: rsync?

У меня есть две копии папки

src/
dest/

Я хочу объединить их, делая следующее:

Если файл находится только в src, Я хочу, чтобы это было перемещено в dest

Если файл находится только в dest, Я хочу это, проигнорировал оставленный в покое IE.

Если файл находится в обоих и имеет идентичное содержание (IE тот же размер и дата), удалите из src

Если файл находится в обоих и не имеет идентичного содержания, оставляет позади в src таким образом, я могу вручную объединить их.

Только очень небольшое количество файлов (между 0% и 5% общих файлов) должно быть в этой последней категории, но я не знаю, как отделиться в обоих и том же от в обоих, но отличающийся.

Я попытался выяснить, как сделать это с rsync но напрасно до сих пор.

13
задан 23.11.2010, 20:31

3 ответа

Я только выполнил тестирование ограниченной функциональности, поэтому быть осторожным с этой командой (-пробный прогон):

rsync -avPr --ignore-existing --remove-source-files src/ dest

Отметьте запаздывание / поскольку это рекурсивно вызовет в src вместо того, чтобы копировать сам src, это должно поддержать Ваши существующие пути.

При помощи - игнорируют - существующий флаг в сочетании с - флаг удалять-исходных-файлов, Вы удалите только файлы из src, которые являются sync'ed от src до dest, который является файлами, которые ранее не существовали в dest только.

Для удаления non-sync'ed файлы, который является теми, которые уже существовали в dest/как в src/, можно использовать:

for file in `find src/ -type f`; do diff $file `echo $file | sed 's/src/dest/'` && rm $file || echo $file; done

или

find src -type f -exec bash -c 'cmp -s "$0" "${0/#src/dest}" && rm "$0"' {} \;

если имена файлов могли бы содержать пробел/новые строки / … Относительно комментария Жабр относительно специальных символов, который является, конечно, чем-то, чтобы помнить и существует много решений, самое простое должно было бы передать-i комнате, которая запросит перед всем удалением. При условии, что src/, или его родительский путь, обеспечивается для нахождения, однако, полностью определенный путь должен привести ко всем именам файлов, обрабатываемым правильно и разностью и командами комнаты без заключения в кавычки.

17
ответ дан 07.12.2019, 11:31

унисон является инструментом, который Вы ищете. Попробуйте унисон-gtk, если Вы предпочитаете gui. Но я не думаю, что это удалит подобные файлы: попытка унисона иметь оба идентичные каталога. Тем не менее, это легко 1) определит, который должны скопировать файлы; 2) которые руководство потребностей объединяется.

6
ответ дан 07.12.2019, 11:31

Следующий сценарий должен сделать вещи обоснованно. Это перемещает файлы от источника до места назначения, никогда не перезаписывая файл и создавая каталоги по мере необходимости. Исходные файлы, которые имеют соответствующий другой файл в месте назначения, оставлены в покое, как файлы, которые не являются регулярными файлами или каталогами (например, символьные ссылки). Файлы, перенесенные в источнике, являются теми, для которых существует конфликт. Остерегайтесь, я не протестировал его вообще.

cd src
find . -exec sh -c '
    set -- "/path/to/dest/$0"
    if [ -d "$0" ]; then #  the source is a directory 
      if ! [ -e "$1" ]; then
        mv -- "$0" "$1"  # move whole directory in one go
      fi
    elif ! [ -e "$0" ]; then  # the source doesn't exist after all
      :  # might happen if a whole directory was moved
    elif ! [ -e "$1" ]; then  # the destination doesn't exist
      mv -- "$0" "$1"
    elif [ -f "$1" ] && cmp -s -- "$0" "$1"; then  # identical files
      rm -- "$0"
    fi
  ' {} \;

Другой подход должен был бы сделать, объединение монтирует один каталог выше другого, например, с funionfs или unionfs-предохранителем.

2
ответ дан 07.12.2019, 11:31

Теги

Похожие вопросы