重複が多い... fdupesなしでスクリプトを作成したい

重複が多い... fdupesなしでスクリプトを作成したい

fdupしないでください。スクリプトを作成したいです。

200以上の重複ファイルがたくさんあります。

私はbashスクリプトを作成しました。

各ファイルにmd5sumを使用し、uniqを使用して冗長md5を使用します。

別のファイルを見つけて、重複した項目を再確認し、行全体を入れました。

3番目の最終文書では。

今問題は...これらの重複した項目を1つずつ削除できるかどうかです。

しかし、私の質問は:重複した項目を見つけて安全に削除するために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

私の質問は... 3番目のファイルをインポートするためにどのようにgrepしますか?

最初のファイルを除くすべての重複エントリを含む4番目のファイル

行(そうしないと、元のファイルを含むすべてのファイルが削除されます!)

したがって、繰り返し行を持つことができますが、同時に

原稿を保管してください。

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または外部プログラムを使用してください。

Bashオートメーションを好む

ベストアンサー1

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

特定の md5sum の配列値がすでに表示されている場合、列 1 に md5sum の awk 配列が作成されます。いいえ初めて見た場合)その行を印刷してください。どちらもデフォルト値0から始まり、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

おすすめ記事