我想编写一个脚本来查找给定目录中的重复文件并根据哈希码删除副本。当我运行该脚本时,它会删除副本和原始文件。
这是我的代码:
#!/bin/bash
a=1;
b=0;
c=1;
while true
do
echo "Enter the directory:"
read directory
if [ -d $directory ]; then
break
else
echo "Invalid directory"
fi
done
for FILE in `ls $directory`
do
b=`expr $b + $a`
if [ $b -gt 2 ]
then
h= `md5sum $directory/$FILE | awk '{ print $1 }'`
a=0;
for f in `ls $directory`
do
a=`expr $a + $c`
if [ $a -gt 2 ]
then
s= `md5sum $directory/$FILE | awk '{ print $1 }'`
if [ "$f" == "$FILE" ]
then
break
else
if [ "$s" = "$h" ]
then
rm -rf $directory/$FILE
fi
fi
fi
done
fi
done
答案1
您的脚本获取目录中的第一个文件并与其中的所有文件进行比较,因此第一个文件将与自身进行检查。这将返回相同的 MD5 哈希值。因为$FILE
和$f
完全相同。您应该更改仅用于比较文件的脚本,并避免将文件与自身进行比较:
#!/bin/bash
while true
do
echo "Enter the directory:"
read directory
if [ -d $directory ]; then
break
else
echo "Invalid directory"
fi
done
for FILE in `ls $directory`
do
if [ ! -f $FILE ]; then
break;
fi
h=`md5sum $directory/$FILE | awk '{ print $1 }'`
for f in `ls $directory`
do
if [ -f $f ] && [ $FILE != $f ]; then
s=`md5sum $directory/$f | awk '{ print $1 }'`
if [ "$s" = "$h" ]; then
echo Removing $f
rm -rf $directory/$f
fi
fi
done
done
也就是说,您可以找到两个不同的文件,它们具有相同的 MD5 哈希值。这种情况并不常见也不容易,但肯定并非不可能。因此,此脚本可以删除两个不同的文件,并“认为”它们具有相同的内容。
更安全的脚本是这样的:
#!/bin/bash
while true
do
echo "Enter the directory:"
read directory
if [ -d $directory ]; then
break
else
echo "Invalid directory"
fi
done
for FILE in `ls $directory`
do
if [ ! -f $FILE ]; then
break;
fi
for f in `ls $directory`
do
if [ -f $f ] && [ $FILE != $f ]; then
cmp -s $directory/$FILE $directory/$f
if [ "$?" -eq 0 ] ; then
echo Removing $f
rm -rf $directory/$f
fi
fi
done
done