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

问题描述 投票:0回答:2

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

为此,我正在尝试编写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操作系统上本地运行的东西。

有什么想法吗?

我最近的尝试(我知道这很不好)

它创建了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";
linux bash shell checksum md5sum
2个回答
1
投票

find是递归处理文件的必备工具:

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

这将选择文件(未命名为'* .md5'),并以文件名$1运行给定的内联Shell脚本。


0
投票

md5sum总是打印在校验和之后给出的路径名,没有选择使其仅打印基本名。从输出中提取校验和,然后将其基名写入md5文件。

read sum pathname < <(md5sum "$file")
printf "%s %s\n" $sum "$file_basename" > "$file.md5"
© www.soinside.com 2019 - 2024. All rights reserved.