「ls *.e*」を「find -execdir」のパラメータとして使用できないのはなぜですか?

「ls *.e*」を「find -execdir」のパラメータとして使用できないのはなぜですか?

*.e*他のファイル()と同じディレクトリにあるファイル()を見つけようとしますmd.tpr。さらに処理するには、次の項目を使用してその項目を一覧表示する必要があります。

find . -name md.tpr -execdir ls *.e* \;

私はこのコマンドのいくつかのバリエーションと他のいくつかのバリエーションを試しました(コマンドに一重引用符を渡すか、いくつかの名前を付けるために渡すことを含む)-execdir。ワイルドカードはまたはに渡されると機能しないようです。上記のコマンドを実行したときに発生するエラーは次のとおりです。sh -c 'ls *.e*'eval 'ls *.e*'-exec-execdir

ls: *.e*: No such file or directory

完全性チェックと同様に、印刷する必要があるものが印刷されたため、そのテストにリストされているディレクトリにファイルが存在するため、-execdir pwdワイルドカードの問題のようです。*.e*

これはあまりエレガントな方法でこの問題を解決することができましたが、ここではなぜワイルドカードとワイルドカードが機能しないのか混乱するだけです。どんなアイデアがありますか?それとも私は完全に軌道を外れたのでしょうか?

私はbash 3.2.25(以前のバージョンですが、そのシステムに対する管理者権限がありません)を使用しています。

また興味深いことに、私がそうするなら

find ~ -name .bashrc -maxdepth 2 -execdir ls -d .b* \;

で完了しないと動作しません$HOME

ベストアンサー1

find コマンドとシェルの両方が可能ファイルグロービング

これは珍しい現象です。ほとんどのコマンドはワイルドカードを使用できず、ワイルドカードを拡張するために完全にシェルに依存します。しかし、findはスーパースーパースーパーユーザーツールであり、これは簡単に怪我をする可能性があります!

例: コマンドを実行するとき

   find /path -iname *.txt

最初に起こるのは、シェルが現在のディレクトリで* .txtと一致するすべてのファイルを見つけようとすることです。見つかった場合は、次の名前に置き換えられます。みんなglob を見つけて find コマンドを呼び出します。検索コマンド決して大きな絵を見ないでこれが発生すると、シェルはそれを存在しないものに拡張しました。

しかし、現在のディレクトリにglobと一致するファイルがない場合、シェルは肩をすくめて未変更のグローブ配信探す。したがって、この時点でfindコマンド(globを理解していることを覚えておいてください)は、globと一致する/ pathで見つかったすべてのファイルの名前を印刷します。

したがって、このようにglobを使用することは、findが現在のディレクトリの内容によって異なる動作をすることを意味します。これはほとんど確かにあなたが望むものではありません!

findがグローブを見る前にシェルがグローブを操作するのを防ぐには、glob をエスケープするには、適切なシェルメタ文字引用符を使用します。 通常、これはグローブストリングを次のように単一引用符で囲むことを意味します。

   find /path -iname '*.txt'

GLOBSは正規表現ではないことを覚えておいてください。 glob ".*"と正規表現 ".*"は非常に異なり、同じ文字列と一致しません!

おすすめ記事