拡張子を指定して、さらにディレクトリ配下すべてを対象にgrepする方法を以下に記します。
findやxargsを使用せず、grepのオプションのみで実現できます。
以下に記す構文により、指定したパターンのファイルのみ対象として検索します。
もちろん、配下のディレクトリ内のファイルも対象となります。(再帰検索となります。)
grep -r --include=パターン 検索文字列 ディレクトリ
尚、オプション-rでサブディレクトリも対象となります。
以下に実行例を記します。
たくさん出力されてしまいます。
$ grep -r cygwin /etc/ /etc/csh.login: set term=cygwin /etc/defaults/etc/csh.login: set term=cygwin /etc/defaults/etc/DIR_COLORS:TERM cygwin /etc/defaults/etc/DIR_COLORS:TERM rxvt-cygwin /etc/defaults/etc/DIR_COLORS:TERM rxvt-cygwin-native <省略>
$ grep -r --include='*.conf' cygwin /etc/ /etc/nsswitch.conf:# see https://cygwin.com/cygwin-ug-net/ntsec.html#ntsec-mapping-nsswitch
指定した拡張子のファイルのみ対象とする場合は、includeでしたが、除外するexcludeオプションもあります。
構文はincludeと同じで、includeがexcludeにかわります。
実行例
$ grep -r --exclude='*.conf' cygwin /etc/ | head -10 /etc/csh.login: set term=cygwin /etc/defaults/etc/csh.login: set term=cygwin /etc/defaults/etc/DIR_COLORS:TERM cygwin /etc/defaults/etc/DIR_COLORS:TERM rxvt-cygwin /etc/defaults/etc/DIR_COLORS:TERM rxvt-cygwin-native <省略>
本資料では、よくあると思われる拡張子によるパターン検索例を記述しました。
しかし、include, exclude に指定するのはパターンなので、以下のようにファイル名にbashという文字列が含まれるものを対象とするようなこともできます。
$ grep -r --include='*bash*' cygwin /etc/ /etc/defaults/etc/skel/.bashrc:# a patch to the cygwin mailing list. /etc/defaults/etc/skel/.bash_profile:# a patch to the cygwin mailing list. /etc/skel/.bashrc:# a patch to the cygwin mailing list. /etc/skel/.bash_profile:# a patch to the cygwin mailing list.
以上、grepで対象ファイルを絞り込み、再帰検索する方法でした。