gpt4 book ai didi

bash - 如何在 xargs 命令中使用 >?

转载 作者:行者123 更新时间:2023-11-29 08:38:15 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

不要犯这样的错误:

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

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

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

适用于 xargs 以及 find

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

也不要解析 ls。曾经。使用 globbing 或 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

注意引号的正确使用。

关于bash - 如何在 xargs 命令中使用 >?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/845863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com