Сравните файлы в двух разных каталогах в Linux
Сценарий оболочки, который показывает различия в нескольких файлах в двух разных каталогах, а также, возможно, создает выходной файл, в том числе и там, где были обнаружены все несоответствия
Состояние
Файл dir1/file1 сравнивается только с dir2/file1 (аналогично для других файлов - file2 сравнивается с file2)
Если обнаружены какие-либо изменения: состояние должно быть "Пропущено совпадение FOUND в файле file1, например", и то же самое следует сделать для всех остальных файлов и записать все результаты в один файл.
заранее спасибо
2 ответа
Используйте команду diff. С использованием -r
флаг вы можете рекурсивно сравнивать папки:
diff -ur dir1 dir2
Вывод будет в формате, который patch
Команда понимает. Вы можете сохранить его в файл и применить эти изменения к dir1
с помощью
diff -ur dir1 dir2 > my.patch
cd dir1
patch -p1 < ../my.patch
Если вы имеете дело с текстовыми файлами и хотите просто увидеть различия, я бы настроил вывод diff, как предложил hek2mgl. Но если вам нужен больший контроль, например, для выполнения некоторых команд после поиска разных файлов или для сравнения двоичных файлов, вы можете использовать find
а также cmp
,
Ниже приведен пример, который вы можете настроить:
#!/bin/bash
IFS_SAVE="$IFS"
IFS=$'\x0a'
for f in $(find dir1 -type f -printf "%f\n"); do {
f1="dir1/$f"
f2="dir2/$f"
cmp --quiet "$f1" "$f2"
check=$?
if [ $check -eq 0 ] ; then
echo -e "OK: $f"
elif [ $check -eq 1 ] ; then
echo -en "Mismatch FOUND in files: "
filesize1=$(stat --printf="%s" "$f1" )
filesize2=$(stat --printf="%s" "$f2" )
echo "$f1" size:"$filesize1" "$f2" size:"$filesize2" check:"$check"
#you may put diff ... or anything else here
else
echo "cannot compare files, probably $f2 is missing"
fi
} ; done
IFS="$IFS_SAVE"
В зависимости от вашей ситуации (если имена файлов не содержат пробелов, отсутствуют пропущенные файлы и т. Д.), Вы можете пропустить некоторые части - это было просто адаптировано из более крупного скрипта.