Как легко обновить список md5sums?

Иногда я использую ненадежную среду (flash) для хранения большого количества данных. Чтобы хотя бы распознать бит флип, я сохраняю файл вместе с md5sums. Этот файл обычно создается с помощью варианта find -type f -exec "{}" \; >MD5SUM find -type f -exec "{}" \; >MD5SUM . Позже я копирую на нем еще несколько файлов, и теперь я хотел бы добавить контрольные суммы новых файлов, не переучитывая старые. К сожалению, время некоторых машин, которые я использую, завинчивается, поэтому используйте find -newer <file> -exec md5sum "{}"\; >>MD5SUM find -newer <file> -exec md5sum "{}"\; >>MD5SUM не вариант. В основном я хотел бы получить разницу между списком файлов, созданным find -type f и списком в файле MD5SUM.

Любые идеи, как это сделать легко и элегантно? Заранее спасибо!

3 Solutions collect form web for “Как легко обновить список md5sums?”

Если это будет продолжающийся процесс, вам понадобятся два файла: старый и новый (который станет старым в следующий раз).

 #!/bin/sh # change directory to either first argument or to current directory cd ${1:-"."} || exit 1 # if cannot cd, then exit # get the md5 values for all the files in the directory tree find . -type f -not -name .md5sum.last -exec md5sum {} \; | sort > .md5sum.tmp # if called before, then get only the differences in the newer if [ -f .md5sum.last ]; then comm -13 .md5sum.last .md5sum.tmp else # otherwise show all the output cat .md5sum.tmp fi # replace the older with the current for next time mv .md5sum.tmp .md5sum.last 

sort и comm -13 являются ключевыми. Сортировка очевидна, но comm (short для «common») будет отображать строки, которые находятся в первом файле (столбец 1), второй файл (столбец 2) или оба (столбец 3). Опция -13 говорит, что «отбирает столбец один и третий», оставляя только строки, которые не только старше, но не являются общими для обоих. К сожалению, если вы не можете доверять методам времени в файлах, это будет очень интенсивный процесс для больших деревьев каталогов.

Я думаю, что самым простым способом было бы хранить контрольную сумму файла _my_file_ в файле _my_file_.md5 не хранить всю контрольную сумму в одном файле. Таким образом, гораздо проще узнать, была ли контрольная сумма раньше.

Однако, если вы только добавляете файлы на свой флеш-накопитель (никогда не изменяйте, возможно, не удаляете, но никогда не добавляете файл, который ранее существовал раньше), вы можете:

 find _your_drive_path_ -type f | while read file; do grep -q $file _your_md5_file_ || md5sum $file >> _your_md5_file_ done 

Этот grep ваш файл контрольной суммы много раз и может быть оптимизирован путем сортировки списка файлов и сохранения файла контрольной суммы, отсортированного по имени файла, но если вам не нужна эта оптимизация, зачем беспокоиться о ее сложности …

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

Я бы сохранил новый файл MD5SUM во временное место, а затем diff старые и новые файлы, чтобы увидеть, что было изменено, прежде чем копировать обновленный файл в flash. Вам может потребоваться отсортировать файл, чтобы получить полезный diff.

  • Как передавать файлы по ssh, а также изменять их разрешения на удаленном сервере без необходимости входа в систему дважды
  • Как считать события фразы в grep, игнорируя случай?
  • Нажатие вкладки после файла сценария sourcing печатает результат, связанный с скриптом
  • использование </ dev / null & в командной строке
  • Чтение пространства в качестве входного файла в сценарии оболочки
  • Отправить команду в оболочку через Makefile
  • Зачем использовать diff / patch, когда проще просто использовать cp
  • встроенная функция экспорта bash
  • Ожидание / dev / sda1, чтобы стать доступным, с таймаутом, в сценарии оболочки
  • соответствие строки awk из 2 столбцов
  • Развернуть переменную среды из PIPE (SHELL)
  • Linux и Unix - лучшая ОС в мире.