Как создать md5sum для новых файлов - PullRequest
0 голосов
/ 03 июня 2018

Мы создали папку на компьютере моего отца, чтобы все члены семьи могли хранить и делиться своими фотографиями и видео.

Example of directories:
/Family_Photo/Penguins/2017 09 02/
/Family_Photo/East Beach/2017 10 11/Seaside/
/Family_Photo/East Beach/2017 10 11/Games/

Используя md5deep, я могу создать полный список контрольных сумм длявсе файлы во всех подкаталогах

md5deep -r /Family_Photo/ > /Family_Photo/md5sum.log

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

Как создать сценарий bash для автоматического обнаружениялюбые файлы, которые ранее не были md5, и сгенерируйте контрольную сумму для этих новых файлов и добавьте в них исходный файл md5sum.log

Ответы [ 3 ]

0 голосов
/ 10 июня 2018

Решение

Это должно помочь:

comm -1 -3 <(grep --text --perl-regex --only-matching '(?<= ).+' /Family_Photo/md5sum.log | sort) <(find /Family_Photo -type f | sort) | xargs --delimiter='\n' --no-run-if-empty md5deep | tee -a /Family_Photo/md5sum.log

Примечания

  • Если вы используете путь, отличный от указанного в примере, обязательно используйте абсолютный и канонический путь или и добавьте параметр -exec realpath {} \; к find, потому что md5deep, кажется, записываеттакие пути в файл, и нам нужно, чтобы они были идентичными для сравнения.
  • Эта командная строка использует bash определенный синтаксис (передача команд в виде файлов) и может не работать в различных интерпретаторах оболочки.

Объяснение

  • comm -1 -3
    • Мы используем эту команду в этом конкретном случае, чтобы увидеть, какие файлы являются новыми, сравнивая найденныефайлы в существующий список.
    • comm сравнивает два отсортированных списка и выводит, какие строки являются уникальными для каждого, а какие общими для обоих
    • -1 означает: не показывать уникальные строкив первый список
    • -3 означает: не показывать строки, общие для обоих файлов
    • какВ результате мы выводим только строки, уникальные для второго списка
  • <(grep --text --perl-regex --only-matching '(?<= ).+' /Family_Photo/md5sum.log | sort) В качестве первого файла comm мы передаем список уже хэшированных имен файлов.
    • <(...) - это синтаксис bash для передачи результата программы в качестве аргумента файла
    • С помощью grep мы извлекаем имена файлов из существующего файла путем сопоставления с любым последующим пробелом
    • --text гарантирует, что md5sum.log всегда считается текстовым файлом и не пропускается
    • --perl-regex использовать синтаксис регулярного выражения perl (нам это нужно для сопоставления при поиске)
    • --only-matching выводится только текст, который соответствует шаблону, а не вся строка с совпадением
    • '(?<= ).+' шаблон сопоставления: (?<= ) шаблон "просмотра", проверяет, предшествовало ли совпадению (два пробела);затем .+ (любые символы, один или несколько)
    • | sort мы передаем вывод grep в sort, потому что comm ожидает отсортированные списки
  • <(find /Family_Photo -type f | sort) В качестве второго файла comm мы передаем все найденные файлы
    • <(...) - синтаксис bash для передачи результата программы в виде файла
    • findповторяет заданный каталог и распечатывает все имена файлов
    • -type -f дает команду find только выводить имена найденных файлов, а не каталогов
    • | sort мы передаем вывод grepв sort, поскольку comm ожидает отсортированные списки
  • | xargs --delimiter='\n' --no-run-if-empty md5deep Полученный список новых файлов передается в md5deep
    • |, который подключает выходcomm на вход xargs
    • xargs вызовет команду (в данном случае md5deep) с любым входным параметром в качестве аргумента
    • --delimiter='\n' задает новыйстрока в качестве разделителя, поэтому другие пробелы в именах файлов не будут приняты за новый аргумент
    • --no-run-if-empty мы не хотим запускаться md5deep если у нас нет ни одного нового имени файла для передачи.
  • | tee --append /Family_Photo/md5sum.log Полученные в результате хеши списка будут записаны в хеш-файл
    • Thisотображает новые файлы / хэши для вашего удобства при записи, если вы не хотите их видеть, просто используйте >> /Family_Photo/md5sum.log.
    • | соединяет выход md5deep со входомtee
    • tee выведет свой ввод и также запишет его в файл
    • --append говорит tee не перезаписывать содержимое файла, а добавлять вместо него
0 голосов
/ 05 июля 2018

Спасибо всем за вклад.После долгих попыток я нашел что-то, что отвечает моим текущим потребностям.

Эта часть запускается только в первый раз

md5deep -r /Family_Photos/ > /Family_Photo/photos.md5
cd Family_Photos/ & find . -print | sort > today.txt

Следующая часть сформирует мой сценарий.Подготовка TXT-файлов для каждого запуска.

cd Family_Photos/ & rm old.txt & mv today.txt old.txt

Для рекурсивного перечисления всех файлов в today.txt

find . -print | sort > today.txt

Обновление вновь добавленных файлов в new.txt

grep -xvFf old.txt today.txt > new.txt

Создайте md5sum из всех новых файлов и добавьте в photos.md5

cat new.txt | xargs -d '\n' md5sum >> photos.md5
0 голосов
/ 03 июня 2018

Я возьму ls -l (и сохраню его в временном файле),
и затем разыграю его новым ls в Daily?На основании, если diff возвращает 0, все в порядке, если diff показывает различия.
Тогда я буду md5 только для файлов, о которых сообщает diff, обновлю ls tempfile новыми ls.Я буду использовать --LTYPE-line-format=%<, поэтому он не будет искать удаленные файлы (файлы, присутствующие в временном файле, но не в свежем ls).

это будет пресудокод для поиска 'new'файлы:

new_files=diff --suppress-common-lines --changed-group-format='%<' --unchanged-group-format='' temp_file $(ls -l)

deleted_files=diff --suppress-common-lines --changed-group-format='%>' --unchanged-group-format='' temp_file $(ls -l) #so you can log deletions too

Я оставляю писать другой код (создайте первый временный файл и хэшируйте данные)

Очевидно, что если у вас есть каталог, вы должны запустить ls -R, чем запустить скриптиз корня пути, который вы хотите сохранить checkd

...