刪除重複檔案的指令碼程式碼
阿新 • • 發佈:2018-11-04
測試環境 :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.