如何在递归 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

我认为这一定是我编造过的最愚蠢的命令管道之一:

$ 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使用不超过一个路径名-n 1进行调用。find路径名将被放入XXX占位符中。
  3. 使用找到的文件上的字符串进行调用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/nullfgrep

如果您坚持在 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

相关内容