Как рекурсивно создать хеш-файл (sha512sum) внутри каждой папки дерева?

1399
Chris

Для данного дерева, скажем / var / ftpd, как мне создать хеш-файл в каждой папке этого дерева с содержимым этой папки в данном дереве? sha1sum и sha512sum не имеют опций рекурсии.

1

2 ответа на вопрос

1
Chris

FWIW the solution is:

user@host bin]$ cat mkshaindir #!/bin/dash cd $1 sha512sum * >.sha512sum [user@host bin]$ find /var/ftpd -type d -print0 | xargs -0 -i mkshaindir {} 

Note that mkshaindir, for my purposes, is a separate component because there may be a need for me to make a hash of files in a new folder, or of one that was recently changed.

The rest is left as an exercise for the reader.

Note: sha512sum will complain to STDERR about non file input (e.g. directories, block files, etc).

+1, though some details might be nice. (e.g. the -print0 xargs-0 to work around 'interesting' filenames. the -type d to select only directries in find, ...) Hennes 9 лет назад 0
Хеннес, с извинениями перед Диккенсом, нет ли Google? Там нет man-страниц? Chris 9 лет назад 0
Yup . Also anoying betknowers who know it all. Still, simplest to the people reading this if we pad it just a tad more. Hennes 9 лет назад 0
Люди приходят на этот сайт для решения или для вдохновения. Те, кто ищет решение, будут просто вставлять и не будут думать, как и почему. Те, кто ищет вдохновения, как я, будут читать страницы руководства и гуглить для себя. Первых не волнует обсуждение, а вторые могли бы только прочитать их, если бы они не могли «получить» свои собственные исследования. Chris 9 лет назад 0
0
user1016274

The script should avoid to include the hashfile itself into the calculation, as saving the hashfile invalidates the hash.
Moreover, I suggest to use find -exec to save resources:

find /var/ftpd -type d -print0 ! -name .sha512sum -exec mkshaindir {} \; 
Ваше утверждение верно, если \ * найдены скрытые файлы (точечные файлы [например .profile]). Поэтому причина использовать файл точек для хранения хеш-значений. Хеш-файл не считается недействительным, потому что ОДНА строка не работает. sha512sum -c hashfile сообщит о сбое одного файла, а не о том, что весь файл недействителен. Человек, знакомый с процессом, поймет, что это проблема курицы / яйца, и проигнорирует одну неудачную строку в файле, которая неприменима. Chris 9 лет назад 0
Я думал о более общем случае, когда вы будете проверять поддерево на наличие измененных файлов. Таким образом, я бы не исключил точечные файлы по принципу, а во-вторых, я бы проверял поддерево по сценарию и его выходное значение (любой файл изменен - ​​ни один файл не изменен в поддереве). Поэтому я либо фильтрую для `.sha512sum` при создании контрольной суммы, либо при проверке файлов контрольной суммы. Но для вашего случая использования я согласен, что общность не считается. user1016274 9 лет назад 0

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