1

Можно ли выполнить команду, которая добавляет 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

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

  • Сравните время модификации файлов со списком (или зарегистрированным моментом времени)
  • Если файл новее списка, запустите на нем 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .