Я хочу сравнить локальную папку и папку на сервере, папка может содержать подпапки, и подпапки могут содержать файлы.
Как вычислить md5sum для целой папки?
Обновление:
Одно возможное решение не будет, чтобы вычислить хеш для целой папки, но вычислить хеш для каждого файла и затем сравнить списки хешей.
Позволяет предполагают, что мы хотим сравнить папки a
и b
:
tree .
.
├── a
│ ├── 1.txt
│ └── d
│ └── 2.txt
└── b
└── 1.txt
Это может показать различие:
find a -type f | sort | xargs md5 -r | cut -f1 -d " " > a.txt
find b -type f | sort | xargs md5 -r | cut -f1 -d " " > b.txt
git diff --no-index a.txt b.txt
Но как проверить, какой файл соответствует хешу, который отсутствует в одной из папок?
Если я
cd a
find . -type f | sort | xargs md5 -r > ../a.txt
cd ..
cd b
find . -type f | sort | xargs md5 -r > ../b.txt
cd ..
git diff --no-index a.txt b.txt
Это решает проблему, однако возможно, не очень изящную.
Решение с zip в другом ответе выглядит хорошим, но для меня имеют некоторые недостатки, это должно архивировать файлы, не показывайте, какой файл отличается.
Из-за этого я предложу одно демонстрационное решение:
cd /target/directory
md5sum * >/tmp/tmp_file
Если Вы имеете подкаталоги и файлы и хотите включать те файлы, также используют
cd /target/directory
find . -type f -exec md5sum {} \; >/tmp/tmp_file
передача tmp_file
к другому серверу и выполняются там
cd /remote_target/directory
md5sum -c /tmp/tmp_file
(если tmp_file
передается в /tmp
каталог), и Вы будете видеть вывод как это:
[root@rh1 sssd]# md5sum -c /tmp/a
./sssd.log: OK
./sssd_implicit_files.log: OK
./sssd_nss.log: OK
./a/aa: OK
Используя rhash для вывода хешей md5 в файл.
$ rhash -Mr -o /path/to/md5sum .
Проверьте хеш из файлов.
$ rhash -c /path/to/md5sum
опции rhash:
-M
MD5: вычислите и распечатайте сумму хеша MD5.-r
Рекурсивно рабочие каталоги, указанные командной строкой.-o
Установите файл для вывода вычисленных хешей и результатов проверки.-c
Проверьте файлы хеша, указанные командной строкой.Сохранение структуры каталогов в тот же файл.
$ find -type d -printf "; %P\n" >> /path/to/md5sum1
Сравните файлы линию за линией.
$ diff md5sum1 md5sum2