ディレクトリに同じファイル/ディレクトリ名を別の大文字と小文字で再帰的にリストする方法は?前任者。 :
入力(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合計し、そのファイルのすべての重複ファイル(存在する場合)を出力します。読みやすくするためにパイプを複数行に設定しました。