2

Я пытаюсь создать zip-файл (или другой архив), который содержит все измененные файлы из двух предоставленных каталогов. Путь к файлам должен быть сохранен в архиве, чтобы архив мог функционировать как патч.

Так в основном похоже на:

diff -crN old_dir new_dir > pathfile

Но затем для удобства создайте zip-файл, содержащий все измененные файлы.

Есть ли стандартное решение для этого или мне нужно будет создать собственный сценарий для этого?

2 ответа2

2

Вы можете перечислить измененные файлы, используя rsync:

rsync -rnc --log-format='%f' new_dir/ old_dir/
  • -r означает рекурсивный
  • -n обозначает выполнение пробного запуска (синоним --dry-run)
  • -c говорит rsync сравнить файл в зависимости от их контрольной суммы
  • --log-format='%f' предоставляет нам имена файлов (полная форма)

Это даст вам список измененных файлов в new_dir/

Затем вам просто нужно предоставить этот список в zip:

zip patch.zip `rsync -rnc --log-format='%f' new/ old/`

Обратите внимание, что если вы указали полный путь ( /path/to/new/dir/ ), используя формат длинного имени ( %f ), rsync вернет дополнительную строку ( /path/to/new/dir/. ). Если вы используете формат короткого имени ( %n ), rsync не вернет эту строку.

1

Я не хочу проповедовать, но прелесть среды * nix заключается в разнообразии инструментов. К сожалению, я не знаю о программном пакете, который делает то, что вы просите, но это можно сделать с помощью сценария. Надеюсь, этот пример поможет вам написать такой скрипт.


У нас есть пара папок с несколькими файлами в них (перестановки 0-5 х 0-5).

$ ls new/ |sort | column -x -c 50 | sed 's/\t/ /g'
00 01 02 03 04 05
10 11 12 13 14 15
20 21 22 23 24 25
30 31 32 33 34 35
40 41 42 43 44 45
50 51 52 53 54 55

Я удалил семь случайных файлов из old и в new папке теперь 7 новых файлов:

$ find . -type d -exec sh -c 'echo -n {} " "; ls {} |wc -l' \;
.  2
./new  36
./old  29

Rsync (отличный инструмент для копирования файлов и создания двух папок одинаково) может изолировать эти новые файлы:

$ rsync --size-only --out-format=%f -rin new/ old/
new/05
new/15
new/21
new/22
new/35
new/54
new/55

Эти имена файлов могут быть переданы в инструмент архивирования, такой как tar, после того, как мы скопируем их в новое место:

$ mkdir diff/new
$ rsync -r --size-only --compare-dest=../../old/ new/  diff/new/
$ tar -C diff -czf diff.tar.gz .

И содержимое архива наши новые файлы:

$ tar tf diff.tar.gz
./
./new/
./new/55
./new/54
./new/35
./new/05
./new/22
./new/15
./new/21

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .