查找重复文件

查找重复文件

我需要编写一个 bash 脚本来查找重复文件,但除此之外还md5sum需要使用它cmp来进行最终检查。我在 shell 中尝试了以下命令。如何添加循环并将其放入 bash 脚本中?

find . -type f | xargs -I%  md5sum % | sort | uniq -w32 -D| cut  -f3 -d' ' 

答案1

既然你说这是家庭作业,我会给你一组提示而不是解决方案。

你可以从这样的事情开始:

find . -type f|xargs -I%  md5sum % |sort \
 |uniq -w32 -D|cut -f3 -d' '|while read filename ; do

   # code here

done

在此while循环内,filename将包含管道检测到的文件之一的名称。

这个想法是将每个文件与之前的文件进行比较。为此,在循环结束时,将当前文件添加到数组中:

count=0
find . -type f|xargs -I%  md5sum % |sort \
 |uniq -w32 -D|cut -f3 -d' '|while read filename ; do

 # code here

 files[$cout]="$filename"
 count=$((count+1))
done

您现在所需要做的就是填写#code here:-) 您可以使用:

  1. 需要比较的文件:$filename
  2. 需要比较的文件:files数组
  3. 应与之比较的文件数量$count(注意相差一错误)

while您可以通过循环比较文件$filename${files[$some_counter]}在每个步骤中对所有这些进行排序。


为了使这一点更好,您应该只检查具有相同内容的文件md5sum。为此,您可以:

  1. cut从管道中删除
  2. 更改read以读取 md5 和和文件名
  3. files当您检测到何时移动到另一个 md5 和时重置数组

这将需要另一个变量来跟踪“当前”md5 和。


您可以通过避免冗余比较来使其变得更好。为此,您需要添加更多逻辑,以避免添加与files该数组中已有文件相同的文件。

而且你可以不用$count变量。

您应该检查(并在必要时修复)非常重要的事情:确保您的脚本适用于包含空格的文件名或目录名。


继续阅读bash 数组

相关内容