同じファイル/ディレクトリ名ですが、大文字と小文字が異なる方法を見つける方法は?

同じファイル/ディレクトリ名ですが、大文字と小文字が異なる方法を見つける方法は?

ディレクトリに同じファイル/ディレクトリ名を別の大文字と小文字で再帰的にリストする方法は?前任者。 :

入力(lsコマンド、ディレクトリではありません):

[user@localhost ~/a] ls -R
.:
b

./b:
ize  Ize

./b/ize:

./b/Ize:
[user@localhost ~/a] 

出力:

/b/ize

答え1

GNUがある場合は、大文字と小文字を区別せずに並べ替え、重複した行のみを印刷できますuniq-i-d

find . | sort -f | uniq -di

@StephaneChazelasが彼の記事で述べたように回答a/b/foo、大文字と小文字が異なる冗長パスがある場合(および)、期待どおりに機能しない可能性A/b/fooがあります。

答え2

ファイル名に改行文字が含まれていないと仮定すると、次のことができます。

find . | tr '[:upper:]' '[:lower:]' | sort | uniq -d

いくつかのtr実装(例:GNU)は、trマルチバイト文字の大文字と小文字を変更しません。

また、報告されるパスはファイルパスではない可能性があります。たとえば、ファイルがあるかどうかを報告し./a/b/fOoます。これが望ましくない場合は、要件を具体化する必要があるかもしれません。./A/b/fOo./a/b/foo

答え3

この考えはすべて悪いことです。チェックサムを使用してファイルが同じであることを確認してください。これにより作業が簡単になります。

find . -type f -exec md5sum {} + |
sort |
perl -a -nE'push(@{$db{$F[0]}},$F[1]);END{for(keys%db){say"Dupe detected @{@db{$_}}"if scalar@{$db{$_}}>1}}'

これは、ディレクトリとすべてのサブディレクトリのすべてのファイルをsha1合計し、そのファイルのすべての重複ファイル(存在する場合)を出力します。読みやすくするためにパイプを複数行に設定しました。

関連情報