2010-03-04 65 views
3

这应该是一个非常简单的任务:我想获取任何旧命令的stdout的每一行,并使用它们执行另一个命令,并将其作为参数。简单的shell解决方案为stdout的每一行执行命令

例如:

ls | grep foo |应用命令'mv%s bar /'

这将取得匹配“foo”的所有内容并将其移动到条形图/目录。

(我觉得有点不好意思问什么可能是一个可笑的显而易见的解决方案。)

+1

如果您的文件名有空格的:http://mywiki.wooledge.org/BashFAQ/020 – 2010-03-04 01:33:14

回答

11

该程序被称为xargs

ls | grep foo | xargs -I %s mv %s bar/ 
+2

xargs还允许您通过指定替换字符串在命令的中间插入参数。即'xargs -I FILE mv FILE bar /' – Martin 2010-03-04 01:28:18

+0

@Martin:谢谢,我学到了一些新东西!将相应地更新我的答案。 – 2010-03-04 01:38:14

+1

也mv有一个--target选项。所以只是:| xargs mv --target = bar/ – pixelbeat 2010-03-04 10:33:42

6
ls | grep foo | while read FILE; do mv "$FILE" bar/; done 

这个特殊的操作可以更简单地完成,但是:

mv *foo* bar/ 

或者一个递归解决方案:

find -name '*foo*' -exec mv {} bar/ \; 

find命令{}将被替换匹配的文件列表。

+0

几乎是正确的:在执行'-exec ... +'时,'{}'必须立即在'+'之前。你可以使用';'形式:'-exec mv {} bar /';''。 – 2010-03-04 01:25:22

0

您的情况,只是这样做。

for file in *foo* 
do 
    if [ -f "$file" ];then 
     mv "$file" /destination 
    fi 
done 

或只是MV,如果你不关心目录或文件

mv *foo* /destination