通过行循环的Shell命令?
最近,我经常发现自己想在具有几行输出另一个命令的输出运行一些命令。通过行循环的Shell命令?
例如,假设我有一个返回上一个新行多项每个文件路径的命令,我想删除所有这些文件。
是否有一个命令,可以帮助我做到这一点?
这听起来像你正在寻找xargs
。从手册页:
xargs的读取从标准输入参数,用空格或换行符(可以用双引号或单引号或反斜杠被保护)界定,并执行该命令(默认为/斌/回声)一次或多次使用任何初始参数,然后从标准输入中读取参数。
所以你可以做这样的事情:
ls | grep -v '*.cpp' | xargs rm
上面的命令将删除当前目录中的一切,除了*.cpp
文件。
在bash类似的炮弹,你可以这样做:
rm `your command`
或
rm $(your command)
这个效果很好,直到文件名包含空格,或者列表增长太长。 – 2009-07-01 00:52:06
在Windows中,CMD:
for /f "usebackq delims=" %i in (`your command`) @del "%i"
PowerShell的:
your command | Remove-Item
尝试
cat file | while read i; do echo "working on line $i"; done
虽然你可以与具有空间线的麻烦。我从来不记得如何解决这个问题。 请注意,一行一行地基础上每操控这个命令的作品。使用xargs只适用于你问的例子(和类似的例子),但是如果你能用xargs解决你的问题,那肯定会去做。
你正在寻找切割。这将打印第一列。如果你想更有趣,请查看sed和/或awk。 http://www.manpagez.com/man/1/cut/ cat file |同时阅读我;做FOO = echo $ i |削减-f1; echo $ FOO;完成 (编辑:从答复转移到评论) – John 2009-07-02 02:43:55
ls | xargs rm
一个有趣的应用(搜索目录的短语在文件中)
find /path/to/dir | xargs grep "search text"
,一个是没有关系的,但它显示xargs的是如何工作的
假设一个UNIX的像环境:
要处理空格的名称,使用-0
标志xargs的。与find:
find . -name '*.mp3' -print0 | xargs -0 dosomething
一些其它命令具有用于NUL分隔的输出,通常是-0
-z
或各种开关。如果你的列表是面向行的,做这样的事情:
cat filelist | tr -s '\012\015' '\000' | xargs -0 dosomething
其中采用tr
来换行和换行转换为完全无效,处理UNIX和DOS(甚至是苹果经典)行结束,跳过空白行。
不要忘记换行符在大多数类UNIX文件系统上都是有效的文件名字符。
如果dosomething
是复杂的,你可以使用bash功能:
dosomething() {
while [ -n "$1" ] ; do
out="$(basename "$1" .mp3).ogg"
convert "$1" "converted/$out"
shift
done
}
export -f dosomething
并调用xargs
,如:
cat filelist | tr -s '\012\015' '\000' | xargs -0 bash -c 'dosomething "[email protected]"' --
注意合理使用双引号保存空间,和双带引号的字符串可嵌套在双引号的$()
eval运算符中。
在功能,你可以写"[email protected]"
得到正确引用参数列表传递给子:
dosomething() {
command1 preargs "[email protected]" postargs | command2
command3 "[email protected]"
}
您还可以使用read
工作线由行:
cat filelist | while read i ; do something "$i" ; done
但是xargs可以让你立即获得所有的参数。
什么环境?视窗? UNIX? – Joey 2009-07-01 00:33:33