次の 2 つの文と混同しています。
A.B. find . -name *.cpp
_find . -name "*.cpp"
正規表現は状況 B でのみ機能します。これを説明できる U から学ぶことができてうれしいです。詳細を教えてください。どうもありがとう。
ここでの焦点は、「-name」オプションに渡すパラメーターです。それを解釈するために、包括的なシェル (bash / tcsh / zsh) ではなく、「検索」が必要です。
"*.cpp"を配置すると、実際には "find" プログラムが "*.cpp" を参照できるようになり、".cpp" で終わるすべてのファイルのリストへの変換が実行されます。
*.cppを配置すると、シェルはパラメーターを find コマンドに渡す前に置換を実行します (これはglobbingと呼ばれます)。find コマンドが実際に取得するのはパターンではなく、一連のファイルです。につながる:
"find . -name A.cpp B.cpp ... Z.cpp "
イタリック体の名前を持つファイルは、「-name」フラグのパラメーターではないため、予期しない動作になります。
最初のコマンドで*.cpp
はシェルによって展開されますが、2 番目のコマンドでは*.cpp
find にそのまま渡され、すべてのサブディレクトリでそれを使用して正しいファイルを探すことができます。
C++ ファイルを含む 2 つのサブディレクトリがあるとします。
a.cpp
e.cpp
sub1/
b.cpp
c.cpp
sub2/
d.cpp
最初のコマンド ( find . -name *.cpp
) は と同等ですがfind . -name a.cpp e.cpp
、これはあなたが望むものではありません! 現在のディレクトリに cpp ファイルがない場合、何も検出されません。
をエスケープし*
てシェルが展開しないようにする別の方法は、 を使用することですfind . -name \*.cpp
。使用すべきものではありませんが、目前の問題を理解するのに役立つ場合があります。
find コマンドを実行する現在のディレクトリに .cpp ファイルがある場合、引用符がないと、シェルはワイルドカードを展開して呼び出します
find . -name file1.cpp file2.cpp ...
引用符を使用すると、星は展開せずに直接検索されます。
-name pattern ファイル名のベース (先頭のディレクトリを削除したパス) は、シェル パターン pattern と一致します。メタ文字 ('*'、'?'、および '[]') は '.' に一致します。ベース名の先頭に (これは findutils-4.2.2 での変更です。以下の「標準準拠」セクションを参照してください)。[...] シェルによる展開から保護するために、パターンを引用符で囲むことを忘れないでください。
検索マニュアルから