Создать отдельный файл MD5 для каждого файла рекурсивно - PullRequest
2 голосов
/ 19 февраля 2020

Я давно хотел следить за своим хранилищем файлов и наблюдать за файлами, которые со временем повреждены.

С этой целью я пытаюсь написать Linux bash Скрипт / shell, чтобы пройти через каталог и создать файл хеш-суммы MD5 для каждого файла, в том же каталоге, что и каждый файл. Я не фанат иметь один файл, который содержит все хэши, потому что он все упадет, если этот единственный файл когда-либо будет поврежден или потерян.

- Directory 1
    - TestFile.txt
    - TestFile.txt.md5
    - AnotherTestFile.wav
    - AnotherTestFile.wav.md5
- Directory 2
    - MyDetails.docx
    - MyDetails.docx.md5

Я пытался использовать команда md5sum различными способами, но она всегда хочет:

  1. Создать все хэши в одном файле.
  2. Создать отдельный .md5 га sh файлы для каждого файла, но имена файлов в файле md5 ha sh содержат полный путь к файлу (например, ./Documents/Directory1/TestFile.txt), а не только имя файла (например, TestFile.txt).

У меня есть инструмент на Windows, который делает это (MD5Checker), но он хэширует файлы на моем файловом сервере по сети. Я бы предпочел что-то, что может работать на операционной системе Linux.

Есть мысли?

Моя последняя попытка (я знаю, что это плохо)

Это создает MD5 файл, но путь к файлу в файле хэш-суммы - это полный путь к файлу, а не путь к базовому файлу.

#!/bin/bash

function md5_dir {
for file in $1/*;
do
        if [[ -f "$file" && ! $file == *.md5 ]];
        then
                file_basename=$(basename "$file");
                echo "$file" "$file_basename";
                md5sum "$file" > "$file.md5";
        fi;
        if [[ -d "$file" ]];
        then
                md5_dir $file
        fi;
done;
}



echo "$1"
md5_dir "$1";

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

find - это инструмент go -to для рекурсивного выполнения чего-либо с файлами:

find . -type f ! -name '*.md5' -execdir sh -c 'md5sum "$1" > "$1.md5"' _ {} \;

Он выбирает файлы (не называемые '* .md5') и запускает указанный встроенный скрипт оболочки с имя файла как $1.

0 голосов
/ 19 февраля 2020

md5sum всегда печатает путь, который он дал после контрольной суммы, нет возможности сделать так, чтобы он печатал только базовое имя. Извлеките контрольную сумму из вывода, а затем запишите ее с базовым именем в файл md5.

read sum pathname < <(md5sum "$file")
printf "%s %s\n" $sum "$file_basename" > "$file.md5"
...