sha1sum ./path/to/directory/* | sha1sum
вышеприведенное было опубликовано как способ вычисления совокупности каталогов, содержащих файлы. Эта команда не выполняется, если каталог содержит больше каталогов. Есть ли способ рекурсивного вычисления Sha1sum каталога каталогов универсально (без пользовательской подгонки алгоритма к конкретному рассматриваемому каталогу)?
find . -type f \( -exec sha1sum "$PWD"/{} \; \) | awk '{print $1}' | sort | sha1sum
@allquixoticМне обычно нравится шаблон "find | xargs", например:
Вы должны использовать «-print0» и «-0», если в именах файлов есть пробелы.
Однако это очень похоже на шаблон «find -exec cmd {}».
Смотрите обсуждение, сравнивая два шаблона здесь: https://stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs
источник
find . -type f -print0 | xargs -0 sha1sum | awk '{print $1}' | sha1sum
.ОБНОВЛЕНИЕ: Прошло несколько лет с тех пор, как я опубликовал этот ответ, и в то же время я переписал и улучшил сценарий, который я представил здесь несколько раз. Я решил опубликовать новый сценарий как новый ответ. Я очень рекомендую это по этому.
ВВЕДЕНИЕ
Я заметил, что порядок, в котором команда find выводит найденные элементы в каталоге, варьируется в пределах одинаковых каталогов на разных разделах. Если вы сравниваете хэши одного и того же каталога, вам не нужно об этом беспокоиться, но если вы получаете хэши, чтобы убедиться, что файлы не были пропущены или повреждены во время копирования, вам необходимо добавить дополнительную строку для сортировка содержимого каталога и его элементов. Например, ответ Мэтью Бонсака довольно элегантный:
Но если вы используете его для сравнения скопированного каталога с его оригиналом, вы отправите вывод в текстовый файл, который вы сравните с выводимым списком из другого каталога, используя Kompare или WinMerge, или просто получите хеши каждого списка. , Дело в том, что порядок, в котором инструмент поиска будет выводить содержимое, может варьироваться от одного каталога к другому, Kompare будет сигнализировать о многих различиях, поскольку хеши не были вычислены в том же порядке. Ничего страшного для небольших каталогов, но довольно раздражает, если вы имеете дело с 30000 файлами. Поэтому вы должны выполнить дополнительные шаги по сортировке выходных данных, чтобы упростить сравнение списков хеш-функций между двумя каталогами.
Это отсортирует выходные данные так, чтобы файлы с одинаковым хешем находились в одинаковых строках при запуске разностной программы (при условии, что в новом каталоге нет файлов).
И НА СЦЕНАРИЙ ...
Вот сценарий, который я написал. Он выполняет те же действия, что и ответ find / xarg, но сортирует файлы перед получением sha1sum (сохраняя их в том же каталоге). Первая строка скрипта находит все файлы в каталоге рекурсивно. Следующий сортирует результаты в алфавитном порядке. Следующие два, берет отсортированный контент и добавляет к файлам в отсортированном списке sha1sum и кавычки, создавая большой скрипт оболочки, который вычисляет хэш каждого файла по одному и выводит его в content_sha1sum.txt.
Надеюсь это поможет.
источник
sort -z
(--zero-terminated
) легче, чем возиться с кучей файлов.ВВЕДЕНИЕ
Несколько лет назад я написал и представил (в этой самой теме) скрипт, который может проверять хэш-подписи всех отдельных файлов в текущей структуре каталогов и выводить их в виде списка в текстовом файле.
С тех пор я несколько раз улучшал эту формулу. Я решил опубликовать свой новый и улучшенный сценарий в качестве отдельного ответа. Он написан для sha256, но любой, кто все еще хочет использовать sha1, может выполнить простой поиск и заменить его в gedit, чтобы заменить sha256 на sha1. Лично я пару лет не использовал sha1 и не рекомендовал бы его, поскольку он устарел, и Google продемонстрировал, как его можно скомпрометировать .
Вот что делает мой новый скрипт:
Вы можете просто использовать скрипт, перейдя в каталог, который вы хотите хэшировать, и введя:
Кроме того, вы можете вызвать этот скрипт из другого каталога, выполнив:
Скрипт определит, есть ли у вас права на запись в текущем каталоге. Если вы это сделаете, результаты будут сохранены в текущем каталоге. Если у вас нет прав на запись или если ваш текущий каталог находится в системе только для чтения (например, cdrom), результаты будут сохранены в домашнем каталоге текущего пользователя.
Скрипт обнаружит, если некоторые из подкаталогов недоступны с текущими привилегиями пользователя. Если все доступно для чтения, повышения привилегий не происходит, если нет, то привилегии пользователя повышаются до уровня root.
Find используется для поиска всех файлов в текущей структуре dir (включая все подкаталоги). Сортировка используется, чтобы убедиться, что результаты выводятся в алфавитном порядке. Полученный список подвергается sha256sum и выводится в текстовый файл.
Со времени написания старого скрипта я принял философию дизайна, согласно которой временные файлы являются злыми, и их следует по возможности избегать, поскольку они оставляют пользователей открытыми для слежки и взлома злонамеренными третьими лицами. Таким образом, все данные в этом новом скрипте обрабатываются как переменные до самой последней минуты, когда результаты выводятся в виде текстового файла.
Сам полученный файл хэшируется, а путь / хэш выводятся в терминале. Мне нравится снимать эти хэши с помощью старой камеры, чтобы убедиться, что файл результатов не был подделан, когда я обращаюсь к нему позже.
Старые файлы результатов игнорируются в подсчете. Это облегчает сравнение результатов.
Вот пример вывода терминала при запуске моего скрипта:
Вот фрагмент вывода, который можно найти в 000_sha256sum_recurs_linux-headers-4.13.0-16-generic_d_22-04-2018_t_02.17.txt:
(это продолжается для других 7000+ строк, как это, но вы поняли идею)
УСТАНОВКА
Откройте терминал и введите следующие команды:
В nano используйте Shif + Ctrl + v для вставки. Ctrl-O и Enter, чтобы сохранить. Ctr-X выходит. Вставьте туда мой скрипт:
(вставьте после #! / bin / bash)
Когда вы выходите из nano, обязательно выйдите из повышенного статуса, введя:
ПОСЛЕДНИЕ МЫСЛИ
Это будет работать только если у вас установлен bash. Я использовал синтакс для манипулирования подстрокой, который не работает с sh, dash, ksh или zsh. Вы по-прежнему можете использовать любые другие оболочки в качестве ежедневных драйверов, но необходимо установить bash.
Выводимые списки можно сравнить с различными инструментами, такими как: (в терминале) diff, sdiff (и графический) diffuse, kdiff, winmerge.
Мой файл сортирует вывод по пути, чтобы его было легче читать людям. Я заметил, что команда сортировки работает по-разному в разных дистрибутивах. Например, в одном дистрибутиве буквы CAPITAL имеют приоритет над не прописными буквами, а в другом - нет. Это влияет на порядок строк выходных файлов и может затруднить сравнение файлов. Это не должно вызывать проблем, если вы всегда используете скрипт в одном и том же дистрибутиве, но может возникнуть, если списки хэшей были созданы в двух разных средах. Это легко исправить, отсортировав хеш-файлы в дополнительное время, чтобы строки упорядочивались по хешу, а не по пути:
источник
#!/usr/bin/env bash
- это будет найти Bash в других каталогах , как хорошо, так как последний может быть установлен в / USR / бен вместо / bin , например, тем временем окр имеет тенденцию быть в / USR / бен во все времена насколько я заметил. Также стоит отметить, что, поскольку вам требуется Bash, вы можете использовать[[ blah-blah ]]
условное выражение с двумя скобками вместо более общего[ blah-blah ]
варианта с одной скобкой.Кажется, это работает для меня:
РЕДАКТИРОВАТЬ: это будет только sha1sum всех файлов, содержащихся в дереве каталогов. Если имя каталога было изменено, оно не будет поймано. Может быть что-то вроде:
Сделал бы это. Примерно такой же ответ, как и у другого
источник
Другая хитрость может заключаться в использовании tar для хэширования содержимого файла и метаданных:
источник
Быстрое, надежное и портативное решение
В отличие от некоторых других решений
tar
, приведенных ниже, решение, приведенное ниже, работает на любой машине, на которой установлены стандартные утилиты Unix, и быстрее, чем все другие решения, путем распараллеливания контрольной суммы:Поскольку в конце используется сортировка, прогресс в реальном времени отсутствует, так что просто позвольте команде выполнить.
Вот что делают аргументы:
find . -type f
находит все файлы в текущем каталоге и его подкаталогахxargs -d'\n'
разбивает вывод команды find на строки (если вы ожидаете, что в них будут файлы с символами новой строки, выполните обычные действияfind -print0 | xargs -0
)-P0 n1
работаетmd5sum
в параллельных процессах, используя максимальное количество процессов, поддерживаемых машиной (многоядерный!)sort -k 2
сортирует по второму полюmd5sum
вывода, которое является полным путем к каждому файлу (первое - MD5)md5sum
вычисляет контрольную сумму списка контрольных сумм файлов, поэтому вы получаете контрольную сумму всего каталога в одной строке, которую вы можете легко сравнить визуально через окна терминалаПрежде чем сказать, что «MD5 был взломан», имейте в виду, какая у вас модель угрозы. Вы пытаетесь убедиться, что файлы, скопированные с другого хоста или диска, остались нетронутыми? Тогда MD5 более чем достаточно, потому что вероятность повреждения файла при передаче, но имеющего тот же MD5, равна нулю. Но если вы боитесь, что злоумышленник успеет заменить файл другим на контрольную сумму, то используйте
sha256sum
. Недостатком является то, что функции SHA работают медленнее, чем MD5 .Подробный прогресс в реальном времени
Наконец, если вы хотите видеть прогресс в реальном времени, измените конвейер, чтобы использовать временный файл для контрольных сумм:
(Обратите внимание, что перемещение
sort
вправо послеfind
не будет работать, потому чтоxargs -P0
распараллеливаетmd5sum
, и результаты могут прийти не в порядке.)Эта версия команды также позволяет вам различать два
/tmp/sums
файла (не забудьте переименовать второй, если он находится на одном компьютере) и посмотреть, какие файлы различаются.источник
Вместо того, чтобы иметь ОДИН огромный файл, содержащий всю хешированную информацию, я искал способ сделать файл в каждой папке дерева. Я черпал вдохновение из комментариев здесь. Мой немного сложнее, чем здесь. Я использую ротацию файлов, но это наименее сложно для новых игроков. Эта версия будет перезаписывать старые контрольные суммы новыми. Может быть полезно сохранить 2-3 версии в зависимости от того, как часто вы запускаете его, и от вашей потребности в «глубине».
Обратите внимание, что mkshaindir, для моих целей, является отдельным компонентом, потому что мне может потребоваться создать хэш файлов в новой папке или в файле, который был недавно изменен. Все это может быть объединено в один скрипт, если это необходимо.
Остальное оставлено в качестве упражнения для читателя.
источник
на основании предыдущего ответа :
find ./path/to/directory -print0 | LC_ALL=C sort --zero-terminated | tar --create --no-recursion --null --files-from /dev/stdin --file /dev/stdout --verbose --numeric-owner | sha1sum
источник
@allquixotic
Ответ не генерирует одинаковые хэши на разных машинах, что не поможет нам проверить и иметь согласованные хэши.Следующая строка
find . -type f \( -exec md5sum "$PWD"/{} \; \)
возвращает следующий вывод:Следовательно, путь будет разным на разных машинах.
awk '{print $1}'
поможет нам получить первый столбец, который имеет только хэш файлов. Позже нам нужно отсортировать эти хэши, где порядок может отличаться на разных машинах, что также может привести к тому, что у нас будут разные хэши, если существует более двух файлов.Решение:
Для Mac:
Для Linux:
источник