findコマンドが機能しません: "無効なオプション--n"

findコマンドが機能しません: "無効なオプション--n"

私のコマンドは次のとおりです。

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議論につながらない可能性が高い。

これは次の状況で発生します。

  1. $PATH未設定
  2. $PATH空の文字列に設定
  3. $PATHスペース、タブ、または改行のみを含めます(デフォルト$IFS)。

$PATHは、コマンドを含む実行可能ファイルを見つけるためにコロンで区切られたディレクトリのリストを含む特殊変数であるため、3findつ、おそらく2つ(find コマンドが現在ディレクトリにない場合)を除外できます。それ以外の場合はエラーが発生しますfind: command not found

設定が解除された場合$PATH1上記)、(または一般的に使用される述語などexecvp())、および一部のシェル(通常はこれらのシェルに見られるKornおよびBourneシェルを含む)でenvfind-exec伝統的なオペレーティングシステム)は、デフォルトの検索findパスで検索して見つけることができます(bashシェルなどのパスはこれを実行しませんが、$PATH起動時に設定されていない場合はデフォルトに設定(エクスポートされませんが))。

ここでは、あなたがしたいと思います:

  • $PATHリポジトリディレクトリ名とは異なる変数名を使用してください(例$dir:)。
  • 変数を引用
  • ${dir:-.}空または設定されていない場合は、現在のディレクトリをデフォルトとして使用したい場合に$dir使用します。
  • $PATH(変数が設定されていない理由を調べることもできます。これは非常にまれです。)

だから:

dir=some-dir
find "${dir:-.}" -name "$FILE.log"

$dir、で始まらないと仮定し、演算子(例えば、、、)-ではなく、ワイルドカード(、、、)を含めません。 、文字通り名前付きファイルではありません)。find!()$FILE*?[...]$FILE.logsomething.logsomething$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"

関連情報