
私が期待するものは次のとおりです。ディレクトリを再帰的に検索して、見つかったすべてのファイルで指定された文字列を見つけます。次のコマンドは、一般的に使用される呼び出しポートです。
find ./ | xargs grep -ns 'foobar'
ただし、引用符を使用すると、シェルにプロンプトが表示foobar
され、コマンドは失敗します。>
問題を引き起こした特定のコマンドは次のとおりです。
find ./ | xargs grep -ns 'add_action(\'save_post\','
バックスラッシュを使用して引用符をエスケープしようとしましたが、役に立ちませんでした。これを行う正しい方法は何ですか?
答え1
一重引用符は一重引用符で終わり、その間にある他のすべての文字はバックスラッシュを含むままです。したがって、一重引用符の間に一重引用符を含めることはできません。 (しかし、あなたはできる'Single quotes aren'\''t ever really embedded in single quotes.'
一重引用符を終了し、一重引用符をエスケープしてから、)のように新しい一重引用符セットを開始します。
提案:grep -r pattern .
現在のディレクトリで繰り返しgrepを実行できる場合は、find + xargsを使用しないでください。
次のコマンドは同じ動作を持ちます。
grep -rns "add_action('save_post'," .
grep -rns 'add_action('\'save_post\', .
最後のコマンドは次のように解釈されます。
'add_action('
->add_action(
\'
->'
save_post
->save_post
\'
->'
,
->,
これらの部品を接続するために、grep
コマンドはパラメータを受け取りますadd_action('save_post',
。
答え2
xargs
パラメータが奇妙な方法で参照されると予想しましたが、find
結果はそうではありません。ファイル名にスペースが含まれていないことがわからない場合は、xargs
withを一緒に使用しないでください。find
\"'
を使わずにxargs
、find
実行したいプログラムを直接呼び出します。
find . -exec grep -ns 'add_action('\''save_post'\'',' {} +
を使用すると、を使用するのexec … {} +
と同じように、複数のファイルに対して同時に一度呼び出されますxargs
。一部の以前のバージョンではこれをサポートfind
していないため、各ファイルに対して一度呼び出して使用する必要+
があります。;
grep
find … -print0 | xargs -0
ユーティリティがそれをサポートしている場合は、そのユーティリティも使用できます。この-print0
オプションは、find
nullバイトで区切られた名前をエクスポートし、引用符を使用せずにnullで区切られた入力を期待するように-0
指示します。xargs
上記の引用に注意してください。一重引用符の間のすべての文字は、'
リテラル文字列の終わりを表す文字を除いて文字通り解釈されます。実際には、'\''
一重引用符で囲まれた文字列を一重引用符で囲まれた文字列に入れる方法です。正式には、「'
末尾引用符、\
リテラル'
一重引用符、'
開始引用符」です。
の特別な場合grep
、実装でサポートする場合、ディレクトリから再帰検索を省略してfind
使用できます。grep -r
grep -r 'add_action('\''save_post'\'',' .
¹これらの機能は、Linux、Cygwin、FreeBSD、OSXでサポートされています。
答え3
grep "add_action('save_post'," ./* -R
-R
このオプションを使用して、現在のディレクトリ内のすべてのファイルに対して繰り返しgrepすることができます。検索文字列はで囲むことができます
"
。