私のプロジェクトのサブディレクトリですべてのJavaScriptファイルを見つけようとしています。
作業ツリーは次のとおりです。
.
├── app
├── assets
├── components
├── email.txt
├── gulpfile.js
├── node_modules
└── package.json
これについて私はこう言います。
find . -name *.js
または
find . -path *.js
奇妙なことは、最初のコマンドは報告だけでgulpfile.js
あり、2番目のコマンドは何も報告しないことです。しかし、私は.js
ファイルを持っapp
ているcomponents
!node_modules
なぜ現れないのですか?
答え1
一重引用符で囲みます*.js
。引用符がない場合、シェルはワイルドカードを現在のディレクトリの一致するファイル名に拡張するため、現在のディレクトリまたはルックアップ仕様のサブディレクトリfind
にあるファイル名のみが取得されます(ただし、ワイルドカードは表示されません)。これを使用するモードにするには、find
シェルの拡張を防ぐ必要があります。'*.js'
この方法。
答え2
シェルワイルドカードがこのプロセスで依然として重要な役割を果たしていることを忘れてしまいやすいです。したがって、*
ファイルリストへの拡張を防ぐためにシェルに指示する方法が必要です。 1つの方法は、Chris Johnsonが述べた引用を使用することです。
もう一つは、次*
のような文字をエスケープすることです。
find . -iname \*.js
比較する:
$ strace -e trace=execve find -maxdept 1 -iname *.js > /dev/null
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "file1.js", "file2.js"], [/* 75 vars */]) = 0
find: unknown predicate `-maxdept'
+++ exited with 1 +++
$ strace -e trace=execve find -maxdept 1 -iname \*.js > /dev/null
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "*.js"], [/* 75 vars */]) = 0
find: unknown predicate `-maxdept'
+++ exited with 1 +++
*
最初のケースでは、現在の作業ディレクトリにあるファイルのリストに展開されていることがわかります。 2番目の例では、-はリテラルパラメータとして扱われます。実際、これはこのパラメーターを参照するのと同じ結果を生成します。file1.js
file2.js
*
find
$ strace -e trace=execve find -maxdept 1 -iname '*.js' > /dev/null
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "*.js"], [/* 75 vars */]) = 0
find: unknown predicate `-maxdept'
+++ exited with 1 +++
代わりに、8進数値を使用できます*
。
$ strace -e trace=execve find -maxdept 1 -iname $'\52'.js > /dev/null
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "*.js"], [/* 75 vars */]) = 0
find: unknown predicate `-maxdept'
+++ exited with 1 +++