среда, 7 декабря 2011 г.

Как получить список изменённых файлов в Linux

Предположим у нас есть папка с исходным набором файлов ${ORIG} и рабочая папка ${ORIG_WITH_CHANGES}, в которую изначально были скопированы файлы из ${ORIG} и произведены некоторые изменения. Задача состоит в том, чтобы получить третью папку ${CHANGES}, которая содержала бы только изменённые файлы с сохранением структуры папок.

Добиться поставленной задачи нам поможет команда 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.

Комментариев нет:

Отправить комментарий