递归地为每个文件创建单独的 MD5 文件

Create separate MD5 file for each file recursively

我一直想关注我的文件存储,并注意随时间推移损坏的文件。

为此,我正在尝试编写一个 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 哈希文件,但 md5 哈希文件中的文件名包含完整的文件路径(例如 ./Documents/Directory1/TestFile.txt),而不仅仅是文件名(例如 TestFile.txt) .

我在 Windows 上有一个工具可以执行此操作 (MD5Checker),但它通过网络对我的文件服务器上的文件进行散列处理。我更喜欢 运行 在 Linux OS.

上原生的东西

有什么想法吗?

我最近的尝试(我知道这很糟糕)

它创建了MD5文件,但是hashsum文件中的文件路径是完整文件路径,而不是基本文件路径。

#!/bin/bash

function md5_dir {
for file in /*;
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 ""
md5_dir "";

md5sum 总是在校验和之后打印它给出的路径名,没有选项让它只打印基本名称。从输出中提取校验和,然后将其与基本名称一起写入 md5 文件。

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

find 是对文件进行递归操作的首选工具:

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

这会选择文件(未命名为“*.md5”)并运行文件名为 .

的给定内联 shell 脚本