给定一个文件的 md5sum,我想知道目录树中是否有其他文件具有相同的 md5sum(但可能名称不同)。如何在 bash 中做到这一点?
PS:需要强调的是,这应该适用于给定目录下的整个树,即必须递归工作,而不仅仅是在当前目录中工作。
答案1
使用find
递归测试所有文件:
find . -type f -exec \
bash -c 'md5sum "$0" | grep -q 2690d194b68463c5a6dd53d32ba573c7 && echo $0' {} \;
这里md5sum
输出 MD5 和和文件名。您需要grep
它来获取实际的 MD5 和,因为没有开关可以让它只输出和。
md5
如果你使用的是 BSD 或 OS X,你可以更轻松地检查 MD5 值:
find . -type f -exec \
bash -c '[ "$(md5 -q "$0")" = 2690d194b68463c5a6dd53d32ba573c7 ] && echo $0' {} \;
答案2
其他解决方案也不错,但我想提出一个生成进程较少的解决方案,如果您有 GNU find,这个解决方案对于许多小文件来说应该会快得多:
find /path/to/tree -type f -exec md5sum \{\} + | sed -nre 's/^md5-to-search-for //p'
或者不使用 GNU find:
find /path/to/tree -type f -print0 | xargs -r -0 -- md5sum | sed -nre 's/^md5-to-search-for //p'
答案3
借鉴 slhck 的一些解决方案,我得出了
find . -type f -print0 | while read -r -d '' f;
do
md5sum "$f" | grep "$1"
done
其中 $1 是第一个参数。如果要检查缺少的参数,请使用以下命令启动文件:
if [ -z "$1" ]
then
echo "No argument supplied"
exit
fi