递归地为每个文件创建单独的 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
命令,但它总是想要:
- 在单个文件中创建所有哈希值。
- 为每个文件创建单独的 .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 脚本
我一直想关注我的文件存储,并注意随时间推移损坏的文件。
为此,我正在尝试编写一个 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 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”)并运行文件名为 .