С rsync
То, что вы делаете, по сути является инкрементной резервной копией: у вашего друга (вашей резервной копии) уже есть исходные файлы, и вы хотите создать архив, содержащий файлы, которые вы изменили по сравнению с этим оригиналом.
Rsync имеет функции для инкрементного резервного копирования.
cd ORIGINAL_AND_MY_CHANGED
rsync -a -c --compare-dest=../ORIGINAL . ../CHANGES_ONLY
-a
означает сохранить все атрибуты (время, собственность и т. д.).
-c
означает сравнивать содержимое файла и не полагаться на дату и размер.
--compare-dest=/some/directory
означает, что файлы, идентичные в этом каталоге и в исходном дереве, не копируются. Обратите внимание, что путь относительно каталога назначения.
Rsync копирует все каталоги, даже если там нет файлов. Чтобы избавиться от этих пустых каталогов, запустите find -depth CHANGES_ONLY -type d -empty -delete
(или, если у вас find
нет -delete
и -empty
, запустите find -depth CHANGES_ONLY -exec rmdir {} + 2>/dev/null
).
Затем сделайте архив из CHANGES_ONLY
каталога.
Пешеходный путь
Пройдите по каталогу с вашим файлом. Пропустить файлы, которые идентичны оригиналу. При необходимости создайте каталоги в целевой папке. Скопируйте измененные файлы.
cd ORIGINAL_AND_MY_CHANGES
find . \! -type d -exec sh -c '
for x; do
if cmp -s "$x" "../ORIGINAL/$x"; then continue; fi
[ -d "../CHANGES_ONLY/$x" ] || mkdir -p "../CHANGES_ONLY/${%/*}"
cp -p "$x" "../CHANGES_ONLY/$x"
done
' {} +