在工作生活当中,我们很可能会遇到查找重复文件的问题。
比如博主我的苹果电脑(MacBook Pro 120G SSD)空间不够用了,想把电脑里的重复的文件删除,只保留一份。
有两个好处,一是,主要目标是节省磁盘空间,不要总是提示“您的启动磁盘几乎已满” 。
Mac os x 频繁的磁盘几乎已满提示
二是,把积年已久的文档重新梳理一遍,尤其是下载目录“~/Doanload”下的文件,默认都下载在这里,Mac os X又没有剪切功能,所以习惯性又拷贝到其他目录,导致下载目录占了接近一半的硬盘空间。
先上代码:
第一步:先找出哪些文件的hash是重复的。
$ find . -not -empty -type f -exec ls -l {} \;|awk {print $6}|sort |uniq -d|xargs-I{} -n1 find . -not -empty -type f -size {}c -print0|xargs -0 -I{} -n1 md5 {}|awk -F = {print $2}’|uniq -d>/tmp/md5.tmp
第二步:文件md5去重。
$ sort/tmp/zzz.tmp |uniq >/tmp/md5.uniq.tmp
第三步:用grep命令,根据md5列表,找出重复的文件
$ find . -not -empty -type f -exec ls -l {} \;|awk {print $6}|sort |uniq -d|xargs -I{} -n1 find . -not -empty -type f -size {}c -print0|xargs -0 -I{} -n1 md5 {}|grep -f /tmp/md5.uniq.tmp >result.log
第三步:使用sed 解析出文件路径
sed -e "s/.*(\(.*\)).*/\1/" result.log
Tips:
1. 提高效率
先找出size大小相同的,再find一遍,然后计算文件md5,看似没有先计算md5,直接去重,而是多执行了一遍find,是为了提高查找效率。因为find size的执行效率要远高于文件md5.尤其是大文件较多的时候。
2. 处理文件名异常状况(文件名中有空格,导致默认分割)
find ~/Downloads/ -name *档案* -print0|xargs -0-I{} -n1 md5 {}
-print0 和 xargs -0 互相对应,print0输出‘\0’分割的文件列表,xargs 通过-0 解析列表
解决了以下文件名中有空格的,默认按照空格分割,导致一个文件当两个文件处理
md5: /Users/me/Downloads//档案文件: No such file or directory
md5: (1).docx: No such file or directory
MD5 (/Users/me/Downloads//档案文件(1).docx) = 6854be938d7edc6647146116f4ad6499
3. AWK 默认分割
awk -F = 是为了解决默认空白字符分割,容易和文件名中的空格混淆,字段分割不清。