我一直想关注我的文件存储,并注意随着时间的推移损坏的文件。
为此,我正在尝试编写Linux bash / shell脚本以遍历目录,并在与每个文件相同的目录中为每个文件创建MD5哈希和文件。我不喜欢拥有包含所有哈希的单个文件,因为如果单个文件损坏或丢失,它将全部掉落。
- Directory 1
- TestFile.txt
- TestFile.txt.md5
- AnotherTestFile.wav
- AnotherTestFile.wav.md5
- Directory 2
- MyDetails.docx
- MyDetails.docx.md5
我试图以多种方式使用md5sum
命令,但它总是想要使用以下一种方法:
./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";
find
是递归处理文件的必备工具:
find . -type f ! -name '*.md5' -execdir sh -c 'md5sum "$1" > "$1.md5"' _ {} \;
这将选择文件(未命名为'* .md5'),并以文件名$1
运行给定的内联Shell脚本。
md5sum
总是打印在校验和之后给出的路径名,没有选择使其仅打印基本名。从输出中提取校验和,然后将其基名写入md5文件。
read sum pathname < <(md5sum "$file")
printf "%s %s\n" $sum "$file_basename" > "$file.md5"