
入力する:
[USER@NOTEBOOK ~/proba] find . -type f | xargs -I "{}" md5sum "{}" | sort
18b17ef2e55f6fd2deb044943a8a769d ./yes
2b00042f7481c7b056c4b410d28f33cf ./tt.txt
2b00042f7481c7b056c4b410d28f33cf ./tx.txt
698458eb994fafdf56c1f63295c942ad ./laksjdasdff.txt
764efa883dda1e11db47671c4a3bbd9e ./ize2.txt
764efa883dda1e11db47671c4a3bbd9e ./ize3.txt
764efa883dda1e11db47671c4a3bbd9e ./ize.txt
a787d6f5ce5deb6e2e4b004f95da5655 ./laksjdf.txt
[USER@NOTEBOOK ~/proba]
出力:
[USER@NOTEBOOK ~/proba] find . -type f | xargs -I "{}" md5sum "{}" | sort | SOMEMAGIC
tt.txt tx.txt
ize2.txt ize3.txt ize.txt
[USER@NOTEBOOK ~/proba]
したがって、md5sumが一致する場合にのみファイル名を出力する「SOMEMAGIC」が必要です(md5sumごとに1行)。 (これは重複排除スクリプトになります。)
答え1
この「魔法」を試してみてください:)
find . -type f | xargs -I "{}" md5sum "{}" | awk '{count[$1]=count[$1]" "$2}END{for(j in count) if( (split(count[j], A)) > 1) print count[j]}' | sed -e 's/\.\///g'
答え2
最初のスクリプトは、次のスクリプトの拡張です。セルゲイ・ロマコフ答えですが、コメントが少し長すぎます。それは食べ物を提供しますファイル名のスペース、各「名前」を参照してください。この方法は必要ありませんタイプステップ。
2番目のスクリプトはsort + awkを使用する別の方法ですが、最初の方法の配列処理はありません。もちろん、これが問題になると、入力順序は失われます(ただし、この問題はとにかくソートステップを使用するため問題ではありません)。
どちらの方法も使用されます。sed\x00
フィールド区切り記号として導入され、空白処理が可能になりました。
方法1、awkの配列。
find . -type f |
xargs -I {} md5sum {} |
sed 's/ [ *]/\x00/' | # " "==text, " *"==binary
awk -F"\x00" '{
if( md5s[$1] == "" ) {sep=""} else {sep=FS}
md5s[$1]=md5s[$1] sep $2 }
END{ for(md5 in md5s ) {
if( (split(md5s[md5], names, FS)) > 1 ) {
sep="\""
for( ix in names ) {
printf "%s%s", sep, names[ix]
sep="\" \"" }
print "\"" } } }'
方法2、ソート+ awk。
find . -type f |
xargs -I {} md5sum {} |
sort |sed 's/ [ *]/\x00/' | # " "==text, " *"==binary
awk -F"\x00" '{
if (pkey!=$1) { ct=-1; pkey=$1; pnam=$2 }
else{if (++ct) { printf(" \"%s\"",$2) }
else { printf("%s\"%s\" \"%s\"",nl,pnam,$2)
nl="\n" } } }
END{ print "" }'
出力
"./tt.txt" "./tx.txt"
"./ize2.txt" "./ize3.txt" "./ize.txt"