利用find命令筛选重复文件

今天遇到了一个问题,在同步百度云网盘的照片时,出现了混乱。我在本地删了很多照片,同时也给已存的照片改了名,按理说同步程序会把本地结果同步到云端。但是不知道怎么回事,程序又把云端的照片下载到本地了。这就使得目录下有了很多不同名的重复文件。而且数量很多,大概两千多张照片,这种情况下手动排除重复照片是很麻烦的一件事。想到自己的windows上装了CGWIN,所以尝试写了一个Shell命令来解决问题。没想到还成功了。

命令如下:

1
2
3
$ find -not -empty -type f -printf "%s\n" |sort -rn|uniq -d|xargs -I{} -n1 find -type f -size {}c -print > repeat.txt
$ mkdir REPEAT
$ cat repeat.txt|awk '{if(NR%2==0) print}'|xargs -I{} mv {} REPEAT

这里一个个讲解下:

  • find -not -empty -type f -printf "%s\n"是用find命令找出不为空的,类型为文件,将这些文件的大小按行打印出来。
    • -printffind命令的格式化选项,都过这个选项可以打印出各种想要的东西。其中%s就是打印文件的大小.可以通过man find去查看详细内容。
  • 打印出所有文件的大小后,根据文件大小的数值进行降序排列后,然后使用uniq -d筛选出重复的文件大小数据。
  • xargs -I{} -n1 find -type f -size {}c -print是反向打印出文件名。我们通过前面的命令能够知道重复的文件大小数值。通过此命令可以通过文件大小的值,把重复的文件名筛选出来。
    • -size {}c后面的c指的是按bytes单位。
  • cat repeat.txt|awk '{if(NR%2==0) print}'|xargs -I{} mv {} REPEAT。将重复的文件名放入到一个文本中。通过筛选文本中的偶数行,就可以获取出那些重复的文件名,然后将其移动到新的文件夹中。

参考链接: