grep
GUNARS
ディレクトリのパターンに対してファイルタイプ別に再帰的に実行するにはどうすればよいですか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文字のいずれもシェル構文では特別ではないため、引用符は必要ありません。
このコードのシェル構文に含まれる特殊文字は次のとおりです。
- パラメータを区別するためにここで使用されるスペース
~
HOME
cshに似た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、~'/'
名前付きユーザーのホームディレクトリに展開されます/
(またはレポート不明なユーザー:/。間違い)。
²また、エンコードが一部のロケールの複数の文字と`
同じか、同じエンコードで終わる文字を探します。\