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

标签 linux bash shell checksum md5sum

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

为此,我尝试编写一个 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 操作系统上 native 运行的东西。

有什么想法吗?

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

它创建 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";

最佳答案

find 是递归地对文件执行任何操作的首选工具:

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

这会选择文件(未命名为“*.md5”)并运行给定的内联 shell 脚本,文件名为 $1

关于linux - 递归地为每个文件创建单独的 MD5 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60289993/

相关文章:

mysql - 如何从 Linux shell 脚本运行 MySQL 过程并将其输出存储在文件中

bash - 可以在 bash if 语句中使用调用 "test"的函数吗?

linux - 如何将 XCode 项目导入到 linux 中?

linux - 使用 ffmpeg 将实时视频从树莓派流式传输到 Web 服务器进行分发

linux - 尝试在 bash 中更改文件名

bash - 将 shell 脚本的输出返回到 makefile 中

c - 如何在c中实现类似于linux系统时钟的时钟

linux - 如何比较文件与关键字文件并用关键字文件第 3 列中的正确字符串替换第 3 列的不匹配字符串

linux - 在 Bash 中只显示一行的一部分

powershell - 如何在我的 Ansible Playbook 中使用 Azure DevOps 服务器 (TFS) 预定义变量?