我需要编写一个 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
:-) 您可以使用:
- 需要比较的文件:
$filename
- 需要比较的文件:
files
数组 - 应与之比较的文件数量
$count
(注意相差一错误)
while
您可以通过循环比较文件$filename
并${files[$some_counter]}
在每个步骤中对所有这些进行排序。
为了使这一点更好,您应该只检查具有相同内容的文件md5sum
。为此,您可以:
cut
从管道中删除- 更改
read
以读取 md5 和和文件名 files
当您检测到何时移动到另一个 md5 和时重置数组
这将需要另一个变量来跟踪“当前”md5 和。
您可以通过避免冗余比较来使其变得更好。为此,您需要添加更多逻辑,以避免添加与files
该数组中已有文件相同的文件。
而且你可以不用$count
变量。
您应该检查(并在必要时修复)非常重要的事情:确保您的脚本适用于包含空格的文件名或目录名。
继续阅读bash 数组。