OS X 10.7.3 を実行しています。ファイル名に共通の文字列が含まれるすべてのファイルを見つけたいと思います。
プレフィックスを除いてファイル名が同じである複数のファイルを含むフォルダーがあります。例:
003 - 日食.mp3
008 - Beautiful Day.mp3
027 - 日食.mp3
103 - ローリングヒルズ.mp3
244 - ローリングヒルズ.mp3
そのリストから、「完全に一意な」名前を持つエンティティを除外したいと思います。この場合: 008 - Beautiful Day.mp3
それを実行する GUI クライアント、自動化スクリプト、またはターミナル コマンドはありますか?
どうもありがとう!
答え1
ls | cut -b 6- | sort | uniq -c | sort -r
これによりプレフィックスがカットされ、ファイルが何回「重複」しているかが表示されます。
答え2
これにより、プレフィックスのないファイル名のリストが出力されます。
awk -F ' - ' '{counts[$2]++; names[$0]} END {for (item in counts) {if (counts[item] > 1) {print item}}}' < <(printf '%s\n' *)
出力例:
Solar Eclipse.mp3
Rolling Hills.mp3
各ファイルの完全なファイル名を印刷するには:
awk -F ' - ' '{counts[$2]++; names[$0]} END {for (name in names) {split(name, parts, / - /); if (counts[parts[2]] > 1) {print name}}}' < <(printf '%s\n' *)
出力例:
027 - Solar Eclipse.mp3
003 - Solar Eclipse.mp3
244 - Rolling Hills.mp3
103 - Rolling Hills.mp3
出力内のファイルの順序は、グループ化されることは保証されません (この単純な例ではグループ化されていますが)。GNU AWK ( gawk
) をお持ちの場合は、出力をグループ化できます。
awk -F ' - ' '
{
counts[$2]++;
names[++c] = $2 " - " $1
}
END {
num = asort(names);
for (i = 1; i <= num; i++) {
split(names[i], indices, / - /)
if (counts[indices[1]] > 1) {
print indices[2] " - " indices[1]
}
}
}
' < <(printf '%s\n' *)
をお持ちでない場合はgawk
、以下を使用できますsort
:
awk ... | sort -k3,3
プロセス置換を使用する代わりにprintf
、AWK スクリプトにパイプすることができます。または、これを再帰的に実行する場合は、パイプまたはプロセス置換のいずれかを使用できます。ファイル名をグローバルに比較する再帰実行が必要な場合は、デフォルトで出力されるfind
ディレクトリ名を削除する必要があります。find