Можно ли выполнить команду, которая добавляет sha256 файла, только если он был изменен?

229
MarianoM

Можно ли выполнить команду, которая добавляет sha256 файла в ранее созданный список, и только если он был изменен в соответствии с последней датой, зарегистрированной в этом списке?

Я не знаю, понимают ли они меня. То, что я хочу сделать, это создать список всех файлов sha256 вместе с датами изменения.

Таким образом, чтобы обновлять список, а не просматривать все файлы (процесс, который занимал бы много времени и требовало использования диска), мне нужна команда, которая сравнивает даты изменений, зарегистрированных в списке, созданном с текущей модификацией. даты каждого из файлов на диске. В случае обнаружения модификации, программа генерирует sha256 файла и перерегистрирует его в списке, перезаписывая предыдущее значение (только этого файла).

Есть ли программа, которая делает это или какая-то идея?

Обновить:

Что мне нужно, так это программа, которая помимо создания ша, по очереди регистрирует дату модификации, принадлежащую каждому файлу.

Например:

Содержимое файла database_of_SHA256.txt:

0adca15c96d77a38aa0447fa87af9c297c * document1.txt 2018-12-03 04:12:23 dca15c96d77a9d30d2a7defad30d2a47fa * document2.txt 2018-09-09 10:19:11 77a915c9defad30d2c96d77aa0447fa87a * document3.txt 2017-01-20 17:34:04 

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

Если контрольная сумма не совпадает, то это означает, что файл действительно был изменен, и этот список должен быть обновлен с новой информацией (было бы хорошо запросить подтверждение для этого), если пользователь подтверждает, что он хочет продолжить, затем список записывается. новая дата и контрольная сумма файла.

1

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

2
Eugen Rieck

Вы можете легко достичь этого с помощью сценария оболочки:

  • Сравните время модификации файлов со списком (или зарегистрированным моментом времени)
  • Если файл новее списка, запустите sha256sumего и замените в списке

Нечто подобное

HASHCHANGED=$(stat -c '%Y' "/path/to/listfile") # Or extract the timestamp from the list for FILE in /path/to/files/* ; do FILECHANGED=$(stat -c '%Y' "$FILE") if test $FILECHANGED -ge $HASHCHANGED; then NEWHASH=$(sha256sum "$FILE") # put the hash into your list, this depends on the list format fi done 

РЕДАКТИРОВАТЬ

Из комментариев я понимаю, что нет предопределенного формата списка, как я предполагал из OQ. это делает естественным использование стандартного sha256sumформата. Теперь мы можем расширить скрипт сверху до полного решения:

# Configuration HASHFILE="/path/to/hashfile" FILEMASK="/path/to/files/*.suffix"  HASHCHANGED=$(stat -c '%Y' "$HASHFILE") while read FILE ; do test -f "$FILE" || continue FILECHANGED=$(stat -c '%Y' "$FILE") if test $FILECHANGED -ge $HASHCHANGED; then NEWHASH=$(sha256sum "$FILE") cat "$HASHFILE" | grep -ve "\\s$FILE\$" > "$HASHFILE.tmp" echo "$NEWHASH" >> "$HASHFILE.tmp" cat "$HASHFILE.tmp" | sort -u > "$HASHFILE" fi done < <(eval "ls -1 $FILEMASK") #Need an eval here to allow * in mask 

Вы должны заполнить начальный список с помощью sha256sum /path/to/files/*mask

Интересно для того, кто знает, но не для таких новичков, как я. Я до сих пор не знаю, как создать список с датами каждого файла, и я не понимаю, где добавить список в вашем коде; Вы не виноваты, что я спрашиваю об этом, ха-ха. Я постараюсь узнать больше о коде и посмотреть, смогу ли я его достичь. MarianoM 5 лет назад 0
@MarianoM посмотри мои правки Eugen Rieck 5 лет назад 0
Спасибо, Евгений! После попыток заставить его работать и тестировать построчно, потому что скрипт был заморожен, я проанализировал его код в соответствии с моими ограниченными знаниями и понял, что вы сравниваете дату хеш-файла и что мне нужно, это сравнить записанную дату в списке с датой файла. Если дата отличается, то новая контрольная сумма генерируется и регистрируется в списке рядом с обновленной датой. MarianoM 5 лет назад 0
Возможно, вы неправильно поняли переводчика. Хотя в верхнем регистре не работает, и готово дает мне неожиданную ошибку, я пробовал несколько способов и построчно, только в том, что я получаю ошибку. MarianoM 5 лет назад 0
Добавьте некоторые детали, чтобы увидеть, если это лучше понять. MarianoM 5 лет назад 0
@MarianoM `Хотя` было опечаткой,` пока` является правильным (строчная буква w) Eugen Rieck 5 лет назад 0

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