
Linuxシステムで重複したファイル名を一覧表示する方法
- 大文字と小文字を無視
- すべてのサブディレクトリを含める
ファイルの違いに基づいて比較しないでください。コンテンツしかし、彼らのものを通して名前。出力は、そのファイルに対して追加のコマンドを実行できるように、パスを含むファイル名のリストでなければなりません。
私たちが持っているとしましょう。
ls -1R /tmp/
foo
BAR
barfoo
a/BAr
a/b/bar
c/bAr
フィルタ/検索スクリプトの出力は次のようになります。
/tmp/BAR
/tmp/a/BAr
/tmp/a/b/bar
/tmp/c/bAr
答え1
find . -printf "%p %f\n" | sort -f -k2 | uniq -Di -f1
find
開始しない場合は、目的の開始ディレクトリを指定します。.
。-type f
ただ追加したい場合文書名前。
- この
find
コマンドは、ディレクトリ順序(つまり、あなたの場合はランダムな順序)でファイル(およびディレクトリ)名のリストを生成します。 -printf "%p %f\n"
フルパス名(相対.
)とファイル名を印刷します。sort -f
は略語ですsort --ignore-case
。つまり、大文字と小文字を区別せずにファイル名のリストをソートします。-k2
2番目のフィールドをソートキーとして使用するように指示します。uniq -Di -f1
つまり、2番目のフィールドと異なるフィールド(たとえば、同じファイル名(大文字と小文字を区別しない))を大文字と小文字を区別せずに比較して、繰り返されるuniq --all-repeated --ignore-case --skip-fields=1
(すべての)出力行を表示します。find
これにより、目的の出力が得られますが、各行の末尾にファイル名が繰り返されます。削除するには、と入力しますsed 's/ .*//'
。
いくつかの問題:
お持ちの場合目次名前は大文字と小文字を除いて同じで、大文字と小文字を除いて同じ名前のファイルが含まれています。たとえば、次のようになります。
documents/design.doc Documents/Design.doc
これにより、これらの項目が一覧表示されます。
ファイル(またはディレクトリ)名にスペース、タブ、または改行が含まれていると問題が発生します。
答え2
これはデフォルトのファイル名には機能しますが、キャリッジリターンやその他の極端なケースがあるファイルには機能しません。
FilesNoPath=$(find . -printf "%f\n")
FilesWithPath=$(find .)
oldIFS=$IFS
IFS=$'\n'
for filename in $FilesNoPath;
do
Matches=$(echo "$FilesWithPath" | grep -i "/$filename$")
if [ $(echo "$Matches" | wc -l) -gt 1 ]
then
echo Found matches:
echo "$Matches"
FilesWithPath=$(echo "$FilesWithPath" | grep -vi "/$filename$")
fi
done
IFS=$oldIFS
出力にフルパスを表示したい場合、または一致するファイルの親ディレクトリでこのコマンドを実行したくない場合は、両方の.
findコマンドを置き換えることができます。/path/to/your/files