私のコマンドは次のとおりです。
find $PATH -name '$FILE.log' > /tmp/file-list.txt
次のエラーメッセージが表示され続けます。
find: illegal option -- n
私がここで何を間違っているのか?
答え1
そのエラーメッセージで判断してみると、そうだと思います。
- 「linux」ラベルにもかかわらず、Linuxベースのシステムにはない可能性があります。
find
通常、Linuxベースのシステムで見つかった実装では、その単語を使用して不明なオプションのエラーを示さないためです。 - この
$PATH
変数は設定されていません。これは、実行中のシェルがBourneまたはKornシェル(AT&T実装)である可能性があることを示します。
それ違法な選択find
従来の Unix 実装における一般的な表現です。
このような伝統的な実装も必要などを使用するには、少なくとも1つのファイルパラメータが必要です-name
。
それ以外の-name
場合、次の引数の場合(述語ではない)オプションとして扱われますfind
。
(-n
最初のオプション-name
は省略形です-n -a -m -e
)は有効なオプションではありませんfind
。
したがって、拡張が$PATH
議論につながらない可能性が高い。
これは次の状況で発生します。
$PATH
未設定$PATH
空の文字列に設定$PATH
スペース、タブ、または改行のみを含めます(デフォルト$IFS
)。
$PATH
は、コマンドを含む実行可能ファイルを見つけるためにコロンで区切られたディレクトリのリストを含む特殊変数であるため、3find
つ、おそらく2つ(find
コマンドが現在ディレクトリにない場合)を除外できます。それ以外の場合はエラーが発生しますfind: command not found
。
設定が解除された場合$PATH
(1
上記)、(または一般的に使用される述語などexecvp()
)、および一部のシェル(通常はこれらのシェルに見られるKornおよびBourneシェルを含む)でenv
find
-exec
伝統的なオペレーティングシステム)は、デフォルトの検索find
パスで検索して見つけることができます(bash
シェルなどのパスはこれを実行しませんが、$PATH
起動時に設定されていない場合はデフォルトに設定(エクスポートされませんが))。
ここでは、あなたがしたいと思います:
$PATH
リポジトリディレクトリ名とは異なる変数名を使用してください(例$dir
:)。- 変数を引用
${dir:-.}
空または設定されていない場合は、現在のディレクトリをデフォルトとして使用したい場合に$dir
使用します。$PATH
(変数が設定されていない理由を調べることもできます。これは非常にまれです。)
だから:
dir=some-dir
find "${dir:-.}" -name "$FILE.log"
$dir
、で始まらないと仮定し、演算子(例えば、、、)-
ではなく、ワイルドカード(、、、)を含めません。 、文字通り名前付きファイルではありません)。find
!
(
)
$FILE
*
?
[...]
$FILE.log
something.log
something
$FILE
$FILE.log
答え2
$PATH
(通常はオーバーライドしない限り多くの問題が発生しますが)コロンで区切られたディレクトリのリストです。find
コマンドラインからスペースで区切られたディレクトリのリストを取得します。
find /path/to/dir1 /path/to/dir2 -name "$FILE.log"
また、一重引用符はシェルが変数を評価するのを無効にするため、$FILE.log
上記のように二重引用符が必要になる場合があります。
$PATH
次のようなさまざまな方法でスペースで区切られたリストに変換できます。
echo $PATH | sed 's/:/ /g'
そして、コマンド置換を使用してリストを find コマンドに入れます。
find $(echo $PATH | sed 's/:/ /g') -name "$FILE.log"
答え3
Googleが同じエラーメッセージ「違法オプション-n」を検索したときにここに来ました。
私はMacOSを使用し、私たちのチームはLinux / Windowsを使用しています。彼らのバージョンはfind
もっと寛大に見えます。
壊れたコマンドは次のとおりです。
find -name "*.jsonnet"
最初の引数にドットを追加して問題を解決します。
find . -name "*.jsonnet"