Сравните файлы в двух разных каталогах в Linux

Сценарий оболочки, который показывает различия в нескольких файлах в двух разных каталогах, а также, возможно, создает выходной файл, в том числе и там, где были обнаружены все несоответствия

Состояние

  1. Файл dir1/file1 сравнивается только с dir2/file1 (аналогично для других файлов - file2 сравнивается с file2)

  2. Если обнаружены какие-либо изменения: состояние должно быть "Пропущено совпадение 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"

В зависимости от вашей ситуации (если имена файлов не содержат пробелов, отсутствуют пропущенные файлы и т. Д.), Вы можете пропустить некоторые части - это было просто адаптировано из более крупного скрипта.

Другие вопросы по тегам