删除重复文件的脚本代码

测试环境 :centos7
⚠️注意:该代码在Mac os系统下会因为参数问题报错 无参数“ls --time-style” "uniq -w" "md5sum" mac 安装md5命令 brew install md5sha1sum

#!/bin/bash

#查找并删除重复文件 每个文件只保留一份

# ls -lS(-l list -S Sort files by size) --time-style指定日期和时间输出格式
# awk 从管道读取ls -lS的输出,对行列进行比较从而找出重复文件
# 执行 awk BEGIN{}语句快,读取文本行工作在{}中
# 文件ls后输出的格式为类似这种
# total 16
#    -rw-r--r-- 1 slynux slynux 5 2010-06-29 11:50 other
#    -rw-r--r-- 1 slynux slynux 6 2010-06-29 11:50 test
#    -rw-r--r-- 1 slynux slynux 6 2010-06-29 11:50 test_copy1
#    -rw-r--r-- 1 slynux slynux 6 2010-06-29 11:50 test_copy2

# 则getline得到第一行后丢弃,然后用getline读取
# 第二行储存第5列的文件大小和第八列的文件名

 ls -lS --time-style=long-iso | awk 'BEGIN {
             getline; getline;
             name1=$8; size=$5
}
{
   name2=$8;
   if (size==$5) 
   	{
	 "md5sum " name1 | getline; csum1=$1;
	 "md5sum " name2 | getline; csum2=$1;
	if ( csum1==csum2 )
	{
	  print name1; print name2
	}

 };
  size=$5; name1=name2;
}' | sort -u > duplicate_files

#中间的{}语句块读取第二行之后的内容 读取到的每一行都存文件名,然后比对文件大小
#如果一样则用md5算法比对文件名 将文件计算得到的md5值保存在csum1中  
#"md5sum " name1 | getline 将md5值输出到stdout,然后 csum1=$1;从stdout读取存储到csum中
#由于第一步按照文件大小排序,若此时md5值相等的话则肯定为重复文件 输出重复的文件名
#sort按字典排序 -u 不重复输出到duplicate_files中

cat duplicate_files | xargs -I {} md5sum {} | sort | uniq -w 32 | awk '{ print "^"$2"$" }' | sort -u > duplicate_sample
#xargs 使用-I指定一个替换字符串{},这个字符串在xargs扩展时会被替换掉
#该句将重复的文件中的一个采样写入duplicate_sample中

echo Removing..
comm duplicate_files duplicate_sample  -2 -3 | tee /dev/stderr | xargs rm
#求差集:打印出那些互不包含的行 打印出到终端同时重定向到文件 /dev/stderr中通过xargs处理传递给rm命令
echo Removed duplicates files successfully.


删除重复文件的脚本代码_第1张图片

你可能感兴趣的:(linux)