2009-07-01 101 views
1

最近,我经常发现自己想在具有几行输出另一个命令的输出运行一些命令。通过行循环的Shell命令?

例如,假设我有一个返回上一个新行多项每个文件路径的命令,我想删除所有这些文件。

是否有一个命令,可以帮助我做到这一点?

+1

什么环境?视窗? UNIX? – Joey 2009-07-01 00:33:33

回答

6

这听起来像你正在寻找xargs。从手册页:

xargs的读取从标准输入参数,用空格或换行符(可以用双引号或单引号或反斜杠被保护)界定,并执行该命令(默认为/斌/回声)一次或多次使用任何初始参数,然后从标准输入中读取参数。

所以你可以做这样的事情:

ls | grep -v '*.cpp' | xargs rm 

上面的命令将删除当前目录中的一切,除了*.cpp文件。

3

在bash类似的炮弹,你可以这样做:

rm `your command` 

rm $(your command) 
+1

这个效果很好,直到文件名包含空格,或者列表增长太长。 – 2009-07-01 00:52:06

3

在Windows中,CMD:

for /f "usebackq delims=" %i in (`your command`) @del "%i" 

PowerShell的:

your command | Remove-Item 
0

尝试

cat file | while read i; do echo "working on line $i"; done 

虽然你可以与具有空间线的麻烦。我从来不记得如何解决这个问题。 请注意,一行一行地基础上每操控这个命令的作品。使用xargs只适用于你问的例子(和类似的例子),但是如果你能用xargs解决你的问题,那肯定会去做。

+0

你正在寻找切割。这将打印第一列。如果你想更有趣,请查看sed和/或awk。 http://www.manpagez.com/man/1/cut/ cat file |同时阅读我;做FOO = echo $ i |削减-f1; echo $ FOO;完成 (编辑:从答复转移到评论) – John 2009-07-02 02:43:55

1
ls | xargs rm 

一个有趣的应用(搜索目录的短语在文件中)

find /path/to/dir | xargs grep "search text" 

,一个是没有关系的,但它显示xargs的是如何工作的

1

假设一个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可以让你立即获得所有的参数。