再帰Grepのディレクトリですべての.texファイルを見つける方法は?

再帰Grepのディレクトリですべての.texファイルを見つける方法は?

.texファイルのみを含むようにシンボリックリンクの再帰検索を拡張したいと思いますfind . -type l -name "Math*" -exec grep -d "recurse" word {} +。失敗した疑似コード1

find . -type l -name "Math*" \
  -exec WHERE CHOOSE ONLY .tex files and Directories \
  -exec grep -d "recurse" word {} +

.tex ファイルとディレクトリを選択するコマンドを入力できません。つまり、擬似コード2

  1. ディレクトリを指す「Math」という名前のすべてのシンボリックリンクを探します。
  2. すべてのシンボリックリンクディレクトリを繰り返します(ここではgrepが制限される可能性があると思います)。
  3. grep wordファイルリストの基本操作の実行

(2)ステップをどのように実行しますか?

答え1

私はこれが私が作ったものの最も愚かなコマンドパイプラインの1つだと思います。

$ find . -type l -name "Math*" -print0 |
  xargs -0 -n 1 -IXXX find XXX/ -type f -name "*.tex" -print0 |
  xargs -0 fgrep "word"
  1. 名前付きのすべてのシンボリックリンクを見つけますMath*
  2. 見つかった各パスで操作をやり直してファイルをfind見つけます*.tex。呼び出すにはxargsパス名が1つだけ必要です。パス名はプレースホルダに入力されます。-n 1findXXX
  3. 呼び出しは、見つかったファイルの文字列で行われますfgrep(つまり、固定された検索文字列があるため)。grep -F

答え2

1つの方法は次のとおりです。

find . -type l -name 'Math*' -print0 | \
xargs -0 sh -c \
    'find -L "$@" -type f -name "*.tex" -exec fgrep word /dev/null {} +' sh

憎悪はsh -c '...' sh必要であり、Math*イベントを処理するときに空白がある可能性があります。それ以外の場合Math* スペースを含むファイル名には拡張されません。、次のように動作します。

find -L $(find . -type l -name 'Math*') -name '*.tex' \
    -exec fgrep word /dev/null {} +

検索できるファイルが1つしかない場合でも、ファイル名が印刷されるようにします/dev/nullfgrep

grepingの前にリンクを解析する必要がある場合は、これを行うこともできますが、(1)ファイル名に改行文字が含まれておらず(2)xargsGNUを使用しているとしますfindutils(BSDはxargs改行文字を許可しません)。-d):

find . -type l -name 'Math*' -exec readlink -f {} + | \
xargs -d '\n' sh -c \
    'find "$@" -type f -name "*.tex" -exec fgrep word /dev/null {} +' sh

関連情報