Linuxでは、サイズは同じですが、コンテンツが異なるファイルを削除する必要があるため、fdupesはオプションではありません。
次のコマンドを試しましたが、同じサイズのファイルをすべて削除しませんでした(理由はわかりません)。
last=-1; find . -type f -name '*.png' -printf '%f\0' | sort -nz | while read -d '' i; do s=$(stat -c '%s' "$i"); [[ $s = $last ]] && rm "$i"; last=$s; done
どんなアイデアがありますか?私は何が間違っていましたか?
編集:元の投稿に間違いがありました。しなければならない維持する特定のサイズのファイルです。たとえば、次のようになります。
1.png # 23,5 Kb
2.png # 24,6 Kb
4.png # 24,6 Kb > remove
8.png # 24,6 Kb > remove
16.png # 23,5 Kb
基本的に重複するアイテムを削除したいのですが、チェックサムではなくサイズだけで削除したいと思います。
答え1
GNUシステムを使用しているように見えるので、次のことができます。
(export LC_ALL=C
find . -name '*.png' -type f -printf '%20s %p\0' |
sort -z |
uniq -zuDw20 |
cut -zb22- |
xargs -r0 echo rm -f --
)
これは、20文字のパッドサイズと各ファイルのファイルパスを印刷し、uniq -zuDw20
最初の20バイトが繰り返される最後の項目を除くすべての項目を報告します。
満足のいくものを削除してくださいecho
。
あなたが間違ったことは次のとおりです。
read -d '' i
しなければならないIFS= read -rd '' i
。バラより「IFS=read-r-line」を理解する%f
フルパスではなくファイル名のみを使用するため、現在のディレクトリのファイル名でのみ機能します。- ファイルサイズを以前のファイルサイズと比較していますが、ファイルリストをサイズではなく名前でソートしています。したがって、同じサイズのファイルが必ずしもこのリストで連続するわけではありません。