![Linux 上のディレクトリ内の同じサイズのファイルを削除するにはどうすればよいですか?](https://rvso.com/image/164714/Linux%20%E4%B8%8A%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%86%85%E3%81%AE%E5%90%8C%E3%81%98%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
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 つのファイル。例:
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
ファイル名のみであり、完全なパスではないため、現在のディレクトリ内のファイル名に対してのみ機能します。- ファイルのサイズを前のファイルのサイズと比較していますが、ファイルのリストはサイズではなく名前で並べ替えられています。そのため、同じサイズのファイルは必ずしもリスト内で連続しているとは限りません。