我想找到一个 bash 命令,它可以让我 grep 目录中的每个文件并将该 grep 的输出写入单独的文件。我的猜测是做这样的事情
ls -1 | xargs -I{} "grep ABC '{}' > '{}'.out"
但是,据我所知, xargs 不喜欢双引号。但是,如果我删除双引号,那么该命令会将整个命令的输出重定向到一个名为 ‘{}’.out 的文件,而不是一系列单独的文件。
有谁知道使用 xargs 的方法吗?我只是以这个 grep 场景为例来说明我的 xargs 问题,因此任何不使用 xargs 的解决方案都不适用于我。
不要犯这样的错误:
sh -c "grep ABC {} > {}.out"
这会在很多情况下中断,包括时髦的文件名,并且无法正确引用。您{}必须始终是命令的一个完全独立的参数,以避免代码注入错误。你需要做的是:
{}
xargs -I{} sh -c 'grep ABC "$1" > "$1.out"' -- {}
适用于xargs以及find。
xargs
find
顺便说一句,不要在没有-0选项的情况下使用 xargs (除非您不担心破坏数据的非常罕见且受控的一次性交互式使用)。
-0
也不解析ls。曾经。使用通配符或find代替:http://mywiki.wooledge.org/ParsingLs
ls
用于find需要递归的所有内容和一个简单的循环,其他所有内容都使用 glob:
find /foo -exec sh -c 'grep "$1" > "$1.out"' -- {} \;
或非递归:
for file in *; do grep "$file" > "$file.out"; done
注意正确使用引号。