我一直想密切关注我的文件存储,并留意随着时间的推移而损坏的文件。
为此,我尝试编写一个 Linux bash/shell 脚本来递归目录,并为每个文件在与每个文件相同的目录中创建一个 MD5 哈希和文件。我不喜欢使用包含所有哈希值的单个文件,因为如果该单个文件损坏或丢失,它就会全部崩溃。
- Directory 1
- TestFile.txt
- TestFile.txt.md5
- AnotherTestFile.wav
- AnotherTestFile.wav.md5
- Directory 2
- MyDetails.docx
- MyDetails.docx.md5
我尝试以多种方式使用 md5sum
命令,但它总是想要:
- 在单个文件中创建所有哈希值。
- 为每个文件创建单独的 .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/