重複ファイルを削除し、最新のファイルのみを保持する


0

複数のファイルが複製されているが、ファイル名が異なるか、サブフォルダーで失われる写真ダンプフォルダーをクリーンアップしようとしています。

rmlint、duff、fdupesなどのツールを見てきましたが、最新のタイムスタンプを持つファイルのみを保持する方法を見つけることができないようです。結果を後処理する必要があると思いますが、どこから始めればよいのかさえわかりません。

誰かが重複ファイルリストを取得し、最新のファイル以外のすべてを削除する方法を教えてもらえますか?


シェルスクリプトについてどの程度快適ですか?
アンクール

比較的上手ですが、このタスクをどこから始めるべきかわかりません。
pinkie_d_pie_0228

回答:


1

zshシェルを使用していることに注意してください。

次のようなものを試してください(テストされていません; https://github.com/lipidity/btrfs-fun/blob/master/dedupに基づく):

# checksum everything in ${DIR}
cksums=$(mktemp)
find ${DIR} -xdev -type f -print0 | xargs -0 md5sum > $cksums

# loop through each md5 hash found
for hash in $(sort $cksums | uniq -w 32 -d | cut -c 1-32); do
  # list of files with this hash
  files=$(grep $hash $cksums | cut -c 35-)
  f=(${(f)files})
  unset files
  # $f now contains array of files with the same checksum
  # compare the first file to the rest, deleting any that are older
  newest=$f[1]
  for file in $f[2,-1]; do
    # make sure the files are still the same
    cmp $newest $file || continue
    # remove the older file
    if [[ $file -nt $newest ]]; then
      rm $newest
      newest=$file
    else
      rm $file
    fi
  done
done

テストされていませんが、ほとんどの方法で取得できます。さらに説明が必要な場合はお知らせください。


ああ、bashがそのような時間でファイルを比較できるとは知りませんでした(試しただけで、比較はbashでうまく機能します)!はい、その内部forループは、私が必要としたもののほとんどです。どうもありがとう!
pinkie_d_pie_0228

0

私は考えecho使用してチェックサムを生成しsum、その後、ソートのチェックサムにより、コマンドや各種ファイルのそれぞれのファイル名を。を使用して、同じチェックサムを持つものが実際に重複していることを確認できcmpます。


私が言及した3つの重複したファインダーはすべて、すでにそれを行っています。私が欲しいのは、最新のファイルのみを保持することです。
-pinkie_d_pie_0228

ls日付でソートされます。私はそれがつまずきであり、n-way比較ではないことに気付いていませんでした。
ニコールハミルトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.