
.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
- ディレクトリを指す「Math」という名前のすべてのシンボリックリンクを探します。
- すべてのシンボリックリンクディレクトリを繰り返します(ここではgrepが制限される可能性があると思います)。
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"
- 名前付きのすべてのシンボリックリンクを見つけます
Math*
。 - 見つかった各パスで操作をやり直してファイルを
find
見つけます*.tex
。呼び出すにはxargs
パス名が1つだけ必要です。パス名はプレースホルダに入力されます。-n 1
find
XXX
- 呼び出しは、見つかったファイルの文字列で行われます
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/null
。fgrep
grepingの前にリンクを解析する必要がある場合は、これを行うこともできますが、(1)ファイル名に改行文字が含まれておらず(2)xargs
GNUを使用しているとします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