【问题标题】:Easy shell solution to execute a command for each line of stdout [duplicate]为标准输出的每一行执行命令的简单 shell 解决方案 [重复]
【发布时间】:2010-03-04 01:20:00
【问题描述】:

这应该是一个简单得离谱的任务:我想获取任何旧命令的标准输出的每一行,并使用每一行以它作为参数来执行另一个命令。

例如:

ls | grep foo | applycommand 'mv %s bar/'

这会将匹配“foo”的所有内容移至 bar/ 目录。

(我觉得有点尴尬,问什么可能是一个显而易见的解决方案。)

【问题讨论】:

标签: shell


【解决方案1】:

那个程序叫做xargs

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

【讨论】:

  • xargs 还允许您通过指定替换字符串在命令中间插入参数。即xargs -I FILE mv FILE bar/
  • @Martin:谢谢,我学到了一些新东西!将相应地更新我的答案。
  • mv 也有一个 --target 选项。所以只是:| xargs mv --target=bar/
  • @pixelbeat:谢谢!我试图按照 OP 的要求(使用%s 和所有)来模拟我的答案,但显然在这种情况下,您的解决方案会更好。
  • 这不会对标准输入的每一行执行命令。它只是一次将它捆绑在一起。 OP仅作为示例提及此案例。 :\
【解决方案2】:
ls | grep foo | while read FILE; do mv "$FILE" bar/; done

不过,这个特定的操作可以更简单地完成:

mv *foo* bar/

或者对于递归解决方案:

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

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

【讨论】:

  • 几乎正确:在执行-exec ... + 时,{} 必须紧跟在+ 之前。不过,您可以使用; 表单:-exec mv {} bar/ ';'
【解决方案3】:

对于您的情况,请像这样简单地做。

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

如果您不关心目录或文件,则只需 mv 即可

mv *foo* /destination

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多