Предположим у нас есть папка с исходным набором файлов ${ORIG} и рабочая папка ${ORIG_WITH_CHANGES}, в которую изначально были скопированы файлы из ${ORIG} и произведены некоторые изменения. Задача состоит в том, чтобы получить третью папку ${CHANGES}, которая содержала бы только изменённые файлы с сохранением структуры папок.
Добиться поставленной задачи нам поможет команда rsync:
Добиться поставленной задачи нам поможет команда rsync:
rsync --progress --exclude out -a -c \ --compare-dest=${ORIG} ${ORIG_WITH_CHANGES} ${CHANGES}
cd ${CHANGES}
find -depth -type d -empty -delete find . -name .git -print0 | xargs -0 rm -rf
Использованные параметры команды rsync:
--progress: с этим ключём rsync печатает список обработанных файлов во время работы
--exclude out: игнорировать папку out
-a: включает архивный режим. Это сокращение к следующей комбинации ключей: -rlptgoD
-с: игнорировать время изменения и проверять изменился ли файл, сравнивая его побитно с оригиналом.
--compare-dest=${ORIG}: по умолчанию rsync первый раз скопирует все файлы в папку ${CHANGES}. Нам же нужны только изменённые по сравнению с оригиналом. Эта опция включает сравнение с оригиналом
Первая строка создаёт искомую директорию, но помимо изменённых файлов, она ещё хранит кучу пустых папок. Следующие две команды очищают ${CHANGES} от пустых папок и удаляют все папки с названием ".git".
Эта заметка основана на ответах к моему вопросу на unix.stackexchange.com.
Комментариев нет:
Отправить комментарий