私の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
正しいことを確認してください。