2017-01-13 13 views
0

Существует два каталога: a/ и b/.
Я хотел бы скопировать все файлы (рекурсивно) из a/ в b/.
Однако я хочу только скопировать файл a, если его содержимое отличается от уже существующего файла b. Если соответствующий файл b не существует, вы все равно копируете файл a.Как копировать разные файлы контента из одного каталога в другой?

* «соответствующий файл», я имею в виду файлы с тем же именем и относительным путем из их родительских каталогов.

Примечание: Причины, почему я не хочу, чтобы перезаписать b файл с точно таким же содержанием, потому, что каталог b находится под контролем другой программы, и я не хочу, дату файла для изменения заставляя программу выполнять больше работы, чем требуется.

Я по существу ищу способ выполнить cp -rf a/ b/ при выполнении проверки diff для каждого файла. Если файл отличается от другого, выполните копию; в противном случае пропустите копию.

Я вижу, что cp имеет флаг обновления:

-u, --update 
      copy only when the SOURCE file is newer than the destination file or when the 
      destination file is missing 

, но это не будет работать, потому что я не обеспокоен новыми файлами; Меня беспокоит разное содержимое файла.

Любой язык оболочки будет работать.
Я пытаюсь получить эту работу, вводя мой чек диффа в команду найти:

find a/ ??? -exec cp {} b \; 

Это не кажется необычным, что нужно сделать между двумя каталогами, поэтому я надеюсь, что там это изящное решение командной строки, так как мне приходится писать сценарий python.

+0

Если вы не заботитесь об эффективности настолько, что-то вроде 'if $ (diff a b) move' может работать. Извините, я знаю, что синтаксис неправильный, bash я всегда забываю. – Toqoz

+0

Просто понял, что вы сказали какой-нибудь язык оболочки; 'если не diff a b; эхо «другое»; end' работает для рыбы. – Toqoz

+0

Stack Overflow - это сайт для вопросов программирования и разработки. Этот вопрос кажется вне темы, потому что речь идет не о программировании или разработке. См. [Какие темы можно задать здесь] (http://stackoverflow.com/help/on-topic) в Справочном центре. Возможно, лучше сказать [Суперпользователь] (http://superuser.com/) или [Unix & Linux Stack Exchange] (http://unix.stackexchange.com/). Также см. [Где я пишу вопросы о Dev Ops?] (Http://meta.stackexchange.com/q/134306) – jww

ответ

1

Вы можете достичь этого, используя rsync. Файлы или каталоги будут обновляться только в том случае, если в исходной папке есть новое обновление.

$rsync -av --progress sourcefolder destinationfolder 
+0

Если я обновляю временную метку файла, но не содержимое, он все равно переносит файл. Это дает мне тот же эффект, что и 'cp -ruffolder destinationfolder destinationfolder'. –

+0

В случае cp, он спросит, хотите ли вы перезаписать файл или нет. В случае rsyc он просто проверяет и обновляет. – Rocoder

+0

Если вы используете опцию v (verbose). Он показывает, сколько байтов он копирует. В случае изменения временной метки он отобразит нулевой байт. – Rocoder