Создать контрольную сумму sha256 всех файлов и каталогов?

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

Команда, которую я пытаюсь выполнить, следующая:

 sha256sum -b * 

Использование:


 -b = Read in Binary.

 * = Specifies that you must verify all file extensions.

С командой я получаю следующий вывод:

sha256sum: test0: каталог e3d748fdf10adca15c96d77a38aa0447fa87af9c297cb0b75e314cc313367daf *test1.txt db0c7a354881fe2dd1b45642a68f6a971c7421e8fdffe56ffa7c740111e07274 *test2.txt

Вместо того, чтобы сообщить, что test0 является каталогом, необходимо также генерировать контрольную сумму содержания.

Вы всегда рекомендуете использовать -b в каком-либо типе файла? В том, какие случаи должны -t использоваться?

Действительно ли возможно отфильтровать типы файлов, которые я хочу опустить в проверке, не имея необходимость добавлять все файлы, которые я хочу допустить? Какую команду я должен выполнить?

Я искал справку, но я не нахожу, что что-либо имело отношение.

1
задан 9 November 2018 в 09:13

2 ответа

Можно использовать find найти все файлы в дереве каталогов и позволить ему работать sha256sum. Следующая командная строка создаст контрольные суммы для файлов в текущем каталоге и его подкаталогах.

find . -type f -exec sha256sum {} \;

Я не использую опции -b и -t, но при необходимости можно использовать -b для всех файлов. Единственной разницей, которую я замечаю, является звездочка перед каждым именем файла.

4
ответ дан 3 December 2019 в 06:50

TL;DR

cd /path/to/working/directory
sha256sum <(find . -type f -exec sha256sum \; | sort)

Intro

Более полный ответ на вопрос выше, который устраняет проблему с find "поиском" файлов в разном порядке на разных системы.

Направление вывода в файл, сравните с diff

Во-первых, вы, вероятно, захотите направить вывод в файл для сравнения с diff.Для этого вы должны использовать

find . -type f -exec sha256sum {} \; > file1.lst

Тогда в другой вашей системе

find . -type f -exec sha256sum {} \; > file2.lst
rsync file2.lst user@host:/home/user/file2.lst
ssh user@host
diff file1.lst file2.lst # might not match due to order

Исправление порядка файлов, найденных с помощью find путем передачи в sort

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

Я обнаружил, что порядок, в котором find находит файлы, может различаться между двумя системами, даже если в обоих случаях используется ОС «Debian».

Следовательно, необходимо отсортировать вывод в текстовых файлах.

sort file1.lst > file1sorted.lst
sort file2.lst > file2sorted.lst
diff file1.lst file2.lst # bad
diff file1sorted.lst file2sorted.lst # ok

Вы можете выполнять поиск и сортировку в одной строке, перенаправляя вывод в файл.

find . -type f -exec sha256sum {} \; | sort > file1.lst

Другие суммы sha/md5

Возможно, вы захотите повысить уровень шасуммирования. Чтобы использовать 512-битную версию, просто выполните;

find . -type f -exec sha512sum {} \; | sort > file1.lst

В качестве альтернативы, 256-битная версия может оказаться излишней для того, что вы делаете, поэтому выполните

find . -type f -exec md5sum {} \; | sort > file1.lst

Полная 1-строчная команда для сравнения 2 каталогов с 1 выводом shasum

Теперь, если вы у вас много файлов и вы не хотите сохранять вывод в файл, вы можете просто шасумировать вывод. Для этого используйте

sha256sum <(find . -type -f -exec sha256sum \; | sort)

Конвейер для sort необходим, чтобы обеспечить сортировку вывода перед вычислением окончательной sha256sum. Без этого, если find находит файлы в другом порядке, несмотря на правильность шасумов для каждого файла, общий шасум будет зависеть от порядка.

Проблема, связанная с выводом diff и используемыми путями

Возможно, у вас есть путь, который выглядит так

/A/B/C/*

где * - это подкаталоги и файлы, которые вас интересуют для шасуммирования.Если A/B/C представляет собой 1 или более каталогов, содержащих только 1 подпапку, вы можете случайно запустить команду shasum в неправильном каталоге, что приведет к следующему

sort1.txt
sha256sum1    ./A/B/C/file1

sort2.txt
sha256sum2    ./B/C/file1

Даже если sha256sum = sha256sum2 diff скажет, что файлы разные. (Поскольку они связаны с другим базовым каталогом в пути.)

Вот короткий код на python3 для построчной проверки сумм, который решает эту проблему.

#!/usr/bin/env python3
file1_name = "sort1.txt"
file2_name = "sort2.txt"
file1 = open(file1_name, 'r')
file2 = open(file2_name, 'r')
file1_lines = file1.readlines();
file2_lines = file2.readlines();
if(len(file1_lines) == len(file2_lines)):
    print("line numbers ok")
    for i in range(len(file1_lines)):
        line1 = file1_lines[i]
        line2 = file2_lines[i]
        line1_split = line1.split(' ')
        line2_split = line2.split(' ')
        shasum1 = line1_split[0]
        shasum2 = line2_split[0]
        if(shasum1 != shasum2):
            print("shasum error: ", line1)
else:
    print("Error: file ", file1_name, " number of lines != ", file2_name, " number of lines")
print("done")

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

Это наводит меня на мысль, что на самом деле было бы проще написать код на Python для всего этого, за исключением команды find.

4
ответ дан 4 September 2020 в 10:43

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

Похожие вопросы: