grep 多个文件,输出到以原始文件命名的多个文件

grep on multiple files, output to multiple files named after the original files

我有一个文件夹,里面有 64 个项目,编号如下:1-1、1-2、1-3、1-4、2-1 … 我想要做的是针对特定模式对文件 1-1 进行 grep,将输出保存到名为 1-1a 的新文件中,然后转到文件 1-2,依此类推。所有 64 个文件的模式保持不变。

我尝试了 find-exec grep 'pattern' "{} > {}a" 的变体,但似乎我不能在一行中两次使用 {} 并且仍然将其解释为变量。我也乐于接受使用 awk 或类似工具的建议。

awk 应该很容易

awk '/pattern/{print > FILENAME "a"}' *

为了使用查找,将 * 替换为 find 命令的结果:

awk '/pattern/{print > FILENAME "a"}' $(find ...)`

... 但只有当文件名不包含特殊字符(例如空格)并且列表不会变得太长时才这样做。在这些情况下使用循环。

你可以使用这个find命令

find . -name '*[0-9]-*[0-9]' -exec bash -c '
for f; do grep "pattern" "$f" > "${f}a"; done' - {} +

请注意,您可以多次 运行 此命令,它不会继续创建 13-3aa13-3aaa 等文件