使用 md5 删除重复文件的脚本

使用 md5 删除重复文件的脚本

我想编写一个脚本来查找给定目录中的重复文件并根据哈希码删除副本。当我运行该脚本时,它会删除副本和原始文件。

这是我的代码:

#!/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

相关内容