我想扩展符号链接的递归搜索以仅包含 .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
我认为这一定是我编造过的最愚蠢的命令管道之一:
$ 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
使用不超过一个路径名-n 1
进行调用。find
路径名将被放入XXX
占位符中。 - 使用找到的文件上的字符串进行调用
fgrep
(即因为我们有固定的搜索字符串)。grep -F
答案2
一种方法是:
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 {} +
即使只有一个文件可供搜索,也能确保打印文件名/dev/null
。fgrep
如果您坚持在 grep 之前解析链接,也可以这样做,但代价是假设 (1) 您的文件名不包含换行符,以及 (2) 您使用的xargs
是 GNU findutils
(BSDxargs
不包含换行符)接受-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