Я должен создать список контрольных сумм файлов, которые являются в каталоге, включая любые подкаталоги.
Команда, которую я пытаюсь выполнить, следующая:
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
использоваться?
Действительно ли возможно отфильтровать типы файлов, которые я хочу опустить в проверке, не имея необходимость добавлять все файлы, которые я хочу допустить? Какую команду я должен выполнить?
Я искал справку, но я не нахожу, что что-либо имело отношение.
Можно использовать find
найти все файлы в дереве каталогов и позволить ему работать sha256sum
. Следующая командная строка создаст контрольные суммы для файлов в текущем каталоге и его подкаталогах.
find . -type f -exec sha256sum {} \;
Я не использую опции -b
и -t
, но при необходимости можно использовать -b
для всех файлов. Единственной разницей, которую я замечаю, является звездочка перед каждым именем файла.
cd /path/to/working/directory
sha256sum <(find . -type f -exec sha256sum \; | sort)
Более полный ответ на вопрос выше, который устраняет проблему с 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
Возможно, вы захотите повысить уровень шасуммирования. Чтобы использовать 512-битную версию, просто выполните;
find . -type f -exec sha512sum {} \; | sort > file1.lst
В качестве альтернативы, 256-битная версия может оказаться излишней для того, что вы делаете, поэтому выполните
find . -type f -exec md5sum {} \; | sort > file1.lst
Теперь, если вы у вас много файлов и вы не хотите сохранять вывод в файл, вы можете просто шасумировать вывод. Для этого используйте
sha256sum <(find . -type -f -exec sha256sum \; | sort)
Конвейер для sort
необходим, чтобы обеспечить сортировку вывода перед вычислением окончательной sha256sum
. Без этого, если find
находит файлы в другом порядке, несмотря на правильность шасумов для каждого файла, общий шасум будет зависеть от порядка.
Возможно, у вас есть путь, который выглядит так
/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.