web-dev-qa-db-ja.com

重複ファイルを削除する

私のMacOS 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を削除する必要がありますか?

これを行うにはどうすればよいですか?

これに対する簡単な解決策はありますか?

6
AvL

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

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のコメントを解除する前にテストして、正しいことを確認してください。

4
Tamara Wijsman

また、ファイルの重複を正常に検出(および削除)するには、それを追加します正確ファイルの重複をハッシュで比較する必要があります:

#!/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として保存し、dirnameを最初のパラメーターとして指定して実行します(そうでない場合は$PWDが使用されます)。

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

5
artyom