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