重複ファイルの削除

重複ファイルの削除

私のMac OS X 10.6.7では、iTunesは私の音楽ライブラリのすべてのファイルをコピーしました。現在、1,920個ではなく3,840個のファイルがあります。問題は、iTunesが単にフォルダ全体をコピーするのではなく、各フォルダ内のすべてのファイルをコピーして1コピーに追加することです。

├── album1
│   ├── track1.mp3
│   ├── track1 1.mp3
│   ├── track2.mp3
│   └── track2 1.mp3
└── album2
    ├── track1.m4a
    └── track1 1.m4a

1,920個の重複エントリをクリックする代わりに、端末にいくつかのスマートラインを入力して重複ファイルを削除したいと思います。

find path/to/music/ -name "* 1.*" -delete

これはほとんどの場合機能しますが、次の状況では問題が発生する可能性があります。

└── album2
    ├── track 1.mp3
    └── track 1 1.mp3

"* 1 1.*"後でこのファイルを除いて名前を変更し、重複したファイルを削除する必要がありますか1

どうすればいいですか?

簡単な解決策はありますか?

答え1

私もこれを正常に見つけて削除するために追加します。精密ファイルが重複しています。ハッシュ値でファイルを比較する必要があります。

#!/bin/sh -eu
find "${1:-.}" -type f ! -empty -print0 | xargs -0 md5 -r | \
    awk '$1 in a{sub("^.{33}","");printf "%s\0",$0}a[$1]+=1{}' | \
    xargs -0 rm -v --

別の名前で保存してdeldupes.sh実行し、ディレクトリ名を最初の引数(それ以外の場合は$PWD使用)に渡します。

OS Xでテストされ、長い空白のファイル名で動作します。

答え2

このようなものはテストされていないため、いくつかの構文を変換する必要があるかもしれません。

IFS=$'\n'              # so that only newlines separate words, not spaces
set -f                 # disable globbing
FILES=$(find path/to/music/ -name "* 1.*")

for FILE in ${FILES}; do
    if [[ -f "${FILE% 1.*}" ]] ; do
        echo "Matched ${FILE}."
        # rm "${FILE}" # Uncomment me once you have confirmed it would do what you intend.
    fi
done

${FILE% 1.*}1.*最後に、一致する構文を末尾から削除し、[[ -f ... ]]ファイルが存在することを確認して、末尾に構文のないファイルを含むファイルを削除します。コメントを削除する前に、テストしてrm正しいことを確認してください。

関連情報