Answers:
请勿犯以下错误:
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
的需要递归和一个简单的循环与一切一水珠的一切:
find /foo -exec sh -c 'grep "$1" > "$1.out"' -- {} \;
或非递归:
for file in *; do grep "$file" > "$file.out"; done
注意正确使用引号。
-0
,xargs
将使用您的文件名并破坏其中的所有空格,引号和反斜杠。您应该只是忘了把它xargs
当作工具。如果您有行,请使用bash循环来迭代这些行: while read line; do <command> "$REPLY"; done < file-with-lines
或command | while ...
xargs
都是GNU的),xargs
除非可以与一起使用,否则需要避免-0
。谢谢。
xargs
,但并不总是涉及解析ls
或使用sh -c
。这丝毫没有回答问题,但是该问题的第一个Google搜索结果,只会增加混乱。
xargs -I{} sh -c 'grep ABC "$1" > "$1.out"' -- {}
吗?特别是,嵌入的规则(双引号)和末尾的“-”符号。谢谢
没有xargs
以下情况的解决方案:
find . -mindepth 1 -maxdepth 1 -type f -exec sh -c "grep ABC '{}' > '{}.out'" \;
......而同样的做法可以用 xargs
,事实证明:
ls -1 | xargs -I {} sh -c "grep ABC '{}' > '{}.out'"
编辑:由lhunath备注后添加单引号。
我假设您的示例只是一个示例,您可能需要>做其他事情。GNU Parallel http://www.gnu.org/software/parallel/可能会帮助您。只要您的文件名不包含\ n,它就不需要附加的引号:
ls | parallel "grep ABC {} > {}.out"
如果文件名中带有\ n:
find . -print0 | parallel -0 "grep ABC {} > {}.out"
另外,您还可以并行运行作业。
观看介绍性视频以了解更多信息:http : //pi.dk/1
10秒的安装将尝试进行完整安装;如果失败,则进行个人安装;如果失败,则进行最小安装:
$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 3374ec53bacb199b245af2dda86df6c9
12345678 3374ec53 bacb199b 245af2dd a86df6c9
$ md5sum install.sh | grep 029a9ac06e8b5bc6052eac57b2c3c9ca
029a9ac0 6e8b5bc6 052eac57 b2c3c9ca
$ sha512sum install.sh | grep f517006d9897747bed8a4694b1acba1b
40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4
60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb
$ bash install.sh
如果需要将其移动到未安装GNU Parallel的服务器上,请尝试parallel --embed
。
xargs
无-0
:这仅适用于当你管find
的与输出xargs
,对不对?当我做xargs -a <input_file>
什么时,我将如何使用它?大多数命令都喜欢grep
使用with\n
和not 这样的输出,\0.
我能想到的解决此问题的唯一方法是tr
再次使用它来修复该问题。但是为什么仅将它与一起使用很重要-0
?