サブディレクトリにリストファイルが見つからないのはなぜですか? [コピー]

サブディレクトリにリストファイルが見つからないのはなぜですか? [コピー]

私のプロジェクトのサブディレクトリですべてのJavaScriptファイルを見つけようとしています。

作業ツリーは次のとおりです。

.
├── app
├── assets
├── components
├── email.txt
├── gulpfile.js
├── node_modules
└── package.json

これについて私はこう言います。

find . -name *.js

または

find . -path *.js

奇妙なことは、最初のコマンドは報告だけでgulpfile.jsあり、2番目のコマンドは何も報告しないことです。しかし、私は.jsファイルを持っappているcomponentsnode_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.jsfile2.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 +++

関連情報