1. 程式人生 > >刪除重複檔案的指令碼程式碼

刪除重複檔案的指令碼程式碼

測試環境 :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.


delete duplicate file