Scripting

很多重複…沒有 fdupes,我想製作一個腳本

  • March 1, 2019

請不要 fdup..我想做一個腳本。

我有很多文件重複,有200多個

我製作了(正在建設中)一個 bash 腳本,它使

每個文件上的 md5sum,然後使用 uniq 我將重複的 md5s 放在

另一個文件,然後我再次檢查重複項並將整行

在第三個最終文件中。

現在的問題..我可以一一刪除副本。

但我的問題是:是否可以只找到 dups 並放入第 4 個文件以安全刪除?

這是腳本

#!/bin/bash

# Script is "under construction"

# First we make the md5sum
find mp3 -type f -print0 |xargs -0 md5sum|tee firstfile.txt

# Then we find all the md5sum identical and put in secondfile.txt
sort +1rn -2 +0 -1 firstfile.txt |awk '{print $1}'|uniq -d > secondfile.txt


# then we extract from the secondfile and firstfile md5sum and name
while read line;do grep -i $line firstfile.txt;done  < secondfile.txt > thirdfinal.txt

現在問題..thirdfinal.txt 包含很多類似的行

625e8fd5f878b19b39826db539e01cda  mp3/16.mp3
625e8fd5f878b19b39826db539e01cda  mp3/12.mp3
625e8fd5f878b19b39826db539e01cda  mp3/20.mp3
625e8fd5f878b19b39826db539e01cda  mp3/21.mp3
625e8fd5f878b19b39826db539e01cda  mp3/19.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/9.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/5.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/7.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/10.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/8.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/3.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/2.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/1.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/11.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/6.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/4.mp3
d7fbd596e86dfdb546092f34ab8ca576  mp3/25.mp3
d7fbd596e86dfdb546092f34ab8ca576  mp3/25.mp3

我的問題是…如何 grep 獲取第三個文件

包含所有重複項的第四個文件..除了第一個

行(否則您將刪除所有文件,包括原始文件!)

所以你可以有一行重複但同時

保留原來的。

第 4 個文件必須像這樣

625e8fd5f878b19b39826db539e01cda  mp3/12.mp3
625e8fd5f878b19b39826db539e01cda  mp3/20.mp3
625e8fd5f878b19b39826db539e01cda  mp3/21.mp3
625e8fd5f878b19b39826db539e01cda  mp3/19.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/5.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/7.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/10.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/8.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/3.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/2.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/1.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/11.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/6.mp3
7eac02c26935323fe167d6e39ef6bd0a  mp3/4.mp3
d7fbd596e86dfdb546092f34ab8ca576  mp3/25.mp3

建議?請不要回答:使用 fdup 或外部程序..I

更喜歡 bash 自動化

awk '{ if (seen[$1]++) print }' < file3 > file4

這會在第 1 列中建立一個 md5sum 的 awk 數組;如果已經看到特定 md5sum 的數組值(例如,不是第一次看到),則列印該行。無論哪種方式,它都會增加該 md5sum 的數組值,從預設值零開始。


另一種方式,使用 bash 關聯數組:

unset md5sums
declare -A md5sums
while read md5sum path
do 
 ((md5sums[$md5sum]++))
 [[ ${md5sums[$md5sum]} -gt 1 ]] && printf "%s %s\n" "$md5sum" "$path" 
done < file3 > file4

引用自:https://unix.stackexchange.com/questions/417139