Как я легко обновляю список md5sums?

Можно найти информацию ${...} замены в странице справочника Вашей оболочки, например, колотите (1). Наиболее распространенное:

  • ${var#word} удалите самый короткий префикс: значение переменной var с word префикс (если таковые имеются) удаленный;

  • ${var%word} удалите самый короткий суффикс: значение переменной var с word суффикс удален (если таковые имеются).

  • ${var/pattern/replacement} удалите первое вхождение шаблона

  • ${var//pattern/replacment} удалите все случаи шаблона

Так, в Вашем примере ${f#image} расширяется до значения f (например, image01.png) удаление image префикс, таким образом, это приводит к значению 01.png.

word и replacement часть в ${...} расширения подвергаются тем же подстановочным расширениям как имена файлов; поэтому, если Вы хотите удалить пробелы и -, Вы могли использовать ${f//[ -]/} (замены любое возникновение символов и - с пустой строкой.

Все детали о странице справочника.

3
18.02.2012, 02:04
3 ответа

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

#!/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 (короткий для "общего"), покажет строки, которые находятся в первом файле (столбец 1), второй файл (столбец 2) или оба (столбец 3). -13 опция говорит для "убирания столбца один и три" отъезда только строки, которые не находятся в просто более старом и не характерны для обоих. К сожалению, если бы Вы не можете доверять меткам времени на файлах, затем это было бы очень интенсивным процессом для больших деревьев каталогов.

2
27.01.2020, 21:20
  • 1
    Спасибо за указание на коммуникацию Теперь я могу сделать то, что я хотел: коммуникация-13 <(кошка MD5SUM | sed 's/^[a-z0-9] *//' | вид) <(находят - тип f - не - называют MD5SUM | вид) | xargs-d "\n" md5sum>> MD5SUM, По крайней мере, пока имена файлов не содержит символ новой строки. :) –  antje-m 18.02.2012, 18:25

Я думаю, что самый легкий путь состоял бы в том, чтобы сохранить контрольную сумму файла _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 Ваш файл контрольной суммы много раз и мог быть оптимизирован путем сортировки списка файлов и сохранения файла контрольной суммы отсортированным на имени файла, но если Вам не нужна эта оптимизация, почему, беспокоясь ее сложностью...

2
27.01.2020, 21:20

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

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

0
27.01.2020, 21:20

Теги

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