小编典典

如何在 xargs 命令中使用 >?

all

我想找到一个 bash 命令,它可以让我 grep 目录中的每个文件并将该 grep 的输出写入单独的文件。我的猜测是做这样的事情

ls -1 | xargs -I{} "grep ABC '{}' > '{}'.out"

但是,据我所知, xargs 不喜欢双引号。但是,如果我删除双引号,那么该命令会将整个命令的输出重定向到一个名为 ‘{}’.out
的文件,而不是一系列单独的文件。

有谁知道使用 xargs 的方法吗?我只是以这个 grep 场景为例来说明我的 xargs 问题,因此任何不使用 xargs 的解决方案都不适用于我。


阅读 127

收藏
2022-08-01

共1个答案

小编典典

不要犯这样的错误:

sh -c "grep ABC {} > {}.out"

这会在很多情况下中断,包括时髦的文件名,并且无法正确引用。您{}必须始终是命令的一个完全独立的参数,以避免代码注入错误。你需要做的是:

xargs -I{} sh -c 'grep ABC "$1" > "$1.out"' -- {}

适用于xargs以及find

顺便说一句,不要在没有-0选项的情况下使用 xargs (除非您不担心破坏数据的非常罕见且受控的一次性交互式使用)。

也不解析ls。曾经。使用通配符或find代替:http://mywiki.wooledge.org/ParsingLs

用于find需要递归的所有内容和一个简单的循环,其他所有内容都使用 glob:

find /foo -exec sh -c 'grep "$1" > "$1.out"' -- {} \;

或非递归:

for file in *; do grep "$file" > "$file.out"; done

注意正确使用引号。

2022-08-01