一般的に、空の文字列は現在のディレクトリを示すものではなく、シェルコマンドやシステムコールを示すものでもありません。一部の古いシステムでは実行されましたが、POSIX準拠システムでは実行されませんでした。
空の文字列を渡したときに現在のディレクトリを使用し、プログラムがディレクトリ名を要求するプログラムを見つけることがあります。これは意図的に行われることもあり、指定された文字列がスラッシュで始まらない場合に、現在のディレクトリの絶対パスを先頭に追加することによる副作用もあります。
あなたにとって最良のことは、を離れること./
です。害はありません。
ファイルのリストが
find . … | sed 's!^\./!!'
これは改行を含むいくつかのファイル名を壊すことに注意してください。これは通常、人間による消費では問題にならず、の出力find
はあいまいであるため、プログラムの消費には適していません。-print0
プログラムの使用に適したを使用している場合は、./
とにかく接頭辞について気にする必要はありません。
のfind * …
代わりに使用することもできますfind . …
がfind *
、一般的には不適切になるいくつかの欠陥があることに注意してください。
.
省略されます。
- すべてのドットファイル(
.
または..`で始まる名前のファイル)は省略されます。
- 現在のディレクトリに名前が始まるファイル名
-
(または、!
or (
... と呼ばれるファイル)がある場合、それはオプションまたはによって述語として解釈されfind
ます。
フィルターが現在のディレクトリを除外する場合、最初のポイントは重要ではありません。2番目の点では、パターン..?* .[!.]* *
を使用して現在のディレクトリ内のすべてのファイルを照合できますが、各パターンが少なくとも1つのファイルと一致するかどうかを確認し、一致しない場合は省略する必要があります。これは可能ですが、非常に面倒です。最後のポイントはストッパーです。そのfind *
ため、Quickieコマンドラインでの使用には適していますが、スクリプトでは使用しないでください。
別のアプローチは、シェルの再帰的グロビング機能を使用することです、例えば
printf '%s\n' **/*.h
これはshopt -s globstar
、bashおよびset -o globstar
ksh93でアクティブにする必要があり、ダッシュなどの基本的なPOSIXシェルには存在しません。デフォルトでは、ドットファイルはトラバースされません。それらを含めるには、最初にグロビングshopt -s dotglob
がbashまたはFIGNORE='@(.|..)'
ksh93にあるドットファイルを無視しないようにします。また、一致するものがない場合、このコマンドはパターンを出力します。shopt -s nullglob
代わりにbashで実行して空の行を出力し、~(N)**/*.h
kshでパターンを使用します。
zshでは、再帰的グロビングはデフォルトでオンになっています。glob修飾子D
を使用してドットファイルを含めN
、一致がない場合は空行を出力します(デフォルトでは、パターンがどのファイルとも一致しない場合、zshはエラーをスローします)。printf
上記のように使用できます
print -rl -- **/*.h(DN)
find
結果の表示方法を操作する-printfパラメータがあります。プレフィックスfind . -name '*.h' -printf '%P\n'
を削除し./
ます。何をするか見てくださいfind . -name '*.h' -print
。