(学校プロジェクトの場合)これらのコマンドの違いは何かを理解しようとしていますが、私の場合は、コマンドが壊れているか実行するのに10分以上かかります〜
したがって、サンプルは次のようになります。
sudo find / -type f -execファイル '{}' grep 'シェルスクリプト' |
違い:
#{}に ""なし
-
sudo find / -type f -exec file {} \; | grep ’Shell script’ | wc -l
#いいえ\
-
sudo find / -type f -exec file ’{}’ ; | grep ’Shell script’ | wc -l
#''なしのgrepコマンド
-
sudo find / -type f -exec file ’{}’ \; | grep Shell script | wc -l
お時間をいただきありがとうございます。
答え1
'
まず、スチールドライバが指摘したように、印刷された引用符ではなく直線引用符()を使用する必要があります。
第二に、引用符の有無はコマンド自体で受け取られる内容に影響を与えます。
たとえば、次のことができます。
echo 'semicolon ; echo message'
ここでは、echo1コマンドがパラメータで実行されますsemicolon ; echo message
。これにより、出力は1行になります。
セミコロン;エコメッセージ
今、引用符がないとします。
echo semicolon ; echo message
プログラムechoはまったく同じ方法で実行されます(パラメータ印刷)。ただし、違いは、;
シェルの特殊文字が原因で、シェル自体がこの行を2つのコマンドで異なるように扱うことです。
- エコセミコロン
- エコメッセージ
出力は次のとおりです。
セミコロンメッセージ
あなたの行で引用することができる、または引用しないかもしれない3つの場所があります。
{}
上記のようにGNU は特定のシェルに対して {} を見つけてブロックします。どのシェルですか? 最大シェルは独立した{}を引用する必要がないため、何の効果もありません。
;
find
;
Aは、単一のパラメータを完了するために必要です-exec
。;
シェルの性質のために引用符で囲む必要があります(またはで引用する必要があります。これは重要ではなく\;
、リテラルとして引用する必要はありません)。それ以外の場合、シェルはそれをfindコマンドの後にパイプ()で始まる2番目のコマンドとして解釈し、シェルエラーを発生させます。';'
";"
;
|
予期しない表示 '|'近くに構文エラーがあります。
Shell script
あなたにはgrep
非常に異なる2つの結果があります。最初のケースでは、Shell script
単一の引数()を使用してgrepを呼び出します。それ以外の場合は、2つのパラメータ(first Shell
、second)を使用してscript
呼び出されます。 grepの仕組みを考えると、最初のケースでは、入力から受け取ったテキストを含む行を見つけます。シェルスクリプト。 2番目はテキストを含む行を探します。シェル名前の下ではscript
まったく異なる動作です。
この情報により、どの行が実行するのに正しい行なのか、なぜそのように書かれたのかを把握できます。
1は実際にはシェル組み込み関数を呼び出しますが、/bin/echo
独立して実行されると仮定します。
最終的に正しいパスは3つのことを行います。
- コマンドの実行
file
_システム上のすべてのファイルについて - (該当するファイルを説明する)テキストを含む行を選択してください。シェルスクリプト
- 行数の計算(したがってシェルスクリプトの行数)
(最後のコマンドはを使用するのと同じですgrep -c
)
したがって、プログラムを数千回(ファイルシステムの各項目に対して1回)実行した後にのみ、コマンドの出力(数字)を受け取ります。長い実行時間は正常です。
スキップされたフォルダから実行できるため、その/
サブツリーのみを検索します。
tee /dev/stderr
それが何をしているかを見るもう一つの方法はパイプに挿入することです:
find / -type f -exec file {} \; | tee /dev/stderr | grep "Shell script" | wc -l