検索コマンド:大文字小文字を無視する方法は?


170

巨大なディレクトリ階層で「WSFY321.c」ファイルを探しています。
通常、GNU findを使用しますfind . -name "WSFY321.c"
しかし、大文字と小文字は区別できません。大文字、小文字、または両方の組み合わせを使用できます。

このファイルを見つける最も簡単な方法は何ですか?
より良いものはありfind . | grep -i "WSFY321.c"ますか?

回答:


214

GNUの最近のバージョンにfindは、-iname大文字と小文字を区別しない名前検索用のフラグがあります。

find . -iname "WSFY321.c"

6
また、特にファイルを探しているので、おそらく-type fフラグを使用してさらに数ティックを削ることができるため、inodeがディレクトリである場合に名前を調べる必要はありません。しかし、それは最適化の
ペダンティック

いくつかの正規表現で作業するためにできることfind . -iname \*WSFY321.c\* -type f
Benj

40

GNU find、またはそれを備えた他のバージョンのfindで:

find . -iname 'WSFY321.c'

他のバージョンの場合:

find . -name '[Ww][Ss][Ff][Yy]321.[Cc]'

または、より遅いが入力しやすい妥協案:

find . -name '????321.c' | grep -i '/WSFY[^/]*$'

または、zshで:

print -rl -- **/(#i)WSFY321.c

@Gillesgrep ..(ない/)バージョンのみ大文字を濾過し、I「は[^ /]」を理解していない
Peter.O

@Gilles最初のケースで単一引用符(正確なファイル名)を引用符なしで使用するための引数は何ですか?
ベルンハルト

@ Peter.Oいいえ、bashバージョンの*/。私が意味したgrep -i。名前がで始まるディレクトリ内のファイルをキャッチしないように、と[^/]*いうよりも使用.*WSFYます。
ジル

5
@Bernhard Consistency。
ジル

ありがとう、Gilles:前のコメントを間違った構文で削除し、修正版をテストしましたが、*がないと動作しません(予期しない理由で、少なくとも私には)。大文字と小文字を区別しないオプションが機能しなくなりました:shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c...私はそれが呼ばれる理由ですと仮定しNOCASE グロブ:それは唯一のグロブのコンテキストで動作します(またはので、それはそうです)。
Peter.O

1

macOSの2つのソリューション:

GNUの使用find

brew install findutils --with-default-names
# restart Terminal
find . -iname 'WSFY321.c'

GNUの使用sed

brew install gnu-sed --default-names
# restart Terminal
find -name "$(sed 's|\([[:alpha:]]\)|[\U\1\L\1]|g' <<<'WSFY321.c')"

1
macOS Sierraでは、デフォルトで-inameオプションが使用可能です。
ThomasW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.