如何在xargs命令中使用>

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

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

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

有没有人知道用xargs做这个的方法? 我只是用这个grepscheme作为例子来说明我的xargs问题,所以任何不使用xargs的解决scheme都不适用于我。

不要犯这样的错误:

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

这将打破许多条件,包括时髦的文件名,是不可能引用正确的。 您的{}必须始终是该命令的一个完全独立的参数,以避免代码注入错误。 你需要做的是这样的:

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

适用于xargs以及find

顺便说一句,从来没有使用xargs没有-0选项(除非非常罕见和控制一次性互动使用,你不担心破坏你的数据)。

也不要分析ls 。 永远。 使用globbing或者find : http : //mywiki.wooledge.org/ParsingLs

使用find需要recursion的所有内容,并使用一个简单的循环来查找所有其他的glob:

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

或非recursion的:

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

注意正确使用引号。

没有xargs的解决scheme如下:

 find . -mindepth 1 -maxdepth 1 -type f -exec sh -c "grep ABC '{}' > '{}.out'" \; 

…和xargs ,事实certificate:

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

编辑 : lhunath评论后添加单引号。

我假设你的例子只是一个例子,你可能需要>其他的东西。 GNU并行http://www.gnu.org/software/parallel/可能是你的救援。; 只要您的文件名不包含\ n,就不需要额外的引用:

 ls | parallel "grep ABC {} > {}.out" 

如果你有\ n的文件名在其中:

 find . -print0 | parallel -0 "grep ABC {} > {}.out" 

作为额外的奖励,您可以同时运行这些作业。

编辑。

您可以简单地通过以下方式安装GNU Parallel:

 wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel chmod 755 parallel 

观看介绍video以了解更多信息: http : //pi.dk/1

10秒安装:

 wget pi.dk/3 -qO - | sh -x