ファイルタイプ別に特定のディレクトリでgrepパターンを繰り返し使用する

ファイルタイプ別に特定のディレクトリでgrepパターンを繰り返し使用する

grepGUNARSディレクトリのパターンに対してファイルタイプ別に再帰的に実行するにはどうすればよいですかgadin-1.0

grep -rn --include=*.rc "GUNARS" ~/Opstk/bin/gadin-1.0/"

答え1

--include=*.rc--include=シェル機能を使用して、現在のディレクトリで次から始めて終了するファイル名のリストをシェルに要求する方法。.rcワイルドカードファイル名の生成またはパス名拡張

たとえば、次を参照してください。

zsh% echo --include=*.rc
zsh: no matches found: --include=*.rc
zsh% : > --include=foo.rc > --include=bar.rc
zsh% ls
'--include=bar.rc'  '--include=foo.rc'
zsh% echo --include=*.rc
--include=bar.rc --include=foo.rc

--include=*.rcここでテキストをに渡したいと思いますgrep

grep -rn '--include=*.rc' GUNARS ~/Opstk/bin/gadin-1.0/

または:

grep -rn --include='*'.rc GUNARS ~/Opstk/bin/gadin-1.0/

ただ*引用してみてください。GUNARSこれらの6文字のいずれもシェル構文では特別ではないため、引用符は必要ありません。

このコードのシェル構文に含まれる特殊文字は次のとおりです。

  • パラメータを区別するためにここで使用されるスペース
  • ~HOMEcshに似たKorn / POSIXに似たシェル、そして少なくともいくつかの最新のシェルでは、環境変数(ホームディレクトリ)の値に拡張されます。
  • コマンドを区切る改行文字です。

彼らは正しいです。必然ではない引用してください。必要に応じて他のすべての内容を引用できますが、次のようないくつかのbashシェルから引用できます。~引用しない /または:拡張するには¶:

'grep' '-rn' '--include=*.rc' 'GUNARS' ~/'Opstk/bin/gadin-1.0/'

比較する:

bash-5.2$ echo ~'/'
~/
bash-5.2$ echo ~/
/home/me/

上記のBourneに似たシェル(zshやbashなど)では、単一引用符の代わりに二重引用符を使用できますが、それでも二重引用符($、、、 ²)内に特別な意味を維持するいくつか`\文字があることに注意してください。

の場合grepとは-r--include標準オプションです。すべてのgrep実装がそれをサポートするわけではなく、それを別々に解釈する実装もあります( の場合は多く-r、 の場合はほとんどありません--include)。

一般ファイルのファイル名と行番号を報告する GUNARSより移植性の高い標準的な方法は次のとおりです。.rc$HOME/Opstk/bin/gadin-1.0/

find ~/Opstk/bin/gadin-1.0/ -name '*.rc' -type f \
  -exec grep -n GUNARS /dev/null {} +

少なくとも2つのファイルを渡す/dev/null必要があります。grepファイルを渡す場合にのみ、そのパスは印刷されません。一部の実装では、ファイルパスを強制的に印刷するオプションがgrepあります。-H

シェルを使用すると、zsh次の操作も実行できます。

grep -n GUNARS /dev/null ~/Opstk/bin/gadin-1.0/**/*.rc(.)

一般的なファイル検索は、再帰ワイルドカードおよびワイルドカード修飾子を使用して実行されます。

これにはいくつかの利点があります。

  • ファイルリストの並べ替え
  • 隠し項目を除外します(glob修飾子を使用して再追加できますD)。
  • ファイル名が有効なテキストで構成されていない場合にも適用されます。

しかし、いくつかの欠点もあります。

  • 一致するファイルが多い場合は、システムコマンドの長さの制限に達することがあります(この問題はを使用して解決できますzargs)。
  • 一致するファイルがない場合、エラーが報告されます。

cshの場合1、ここでチルダ拡張from、~'/'名前付きユーザーのホームディレクトリに展開されます/(またはレポート不明なユーザー:/。間違い)。

²また、エンコードが一部のロケールの複数の文字と`同じか、同じエンコードで終わる文字を探します。\

関連情報