代码之家  ›  专栏  ›  技术社区  ›  Nate W.

如何在bash中将多个结果从一个命令发送到另一个命令?

  •  1
  • Nate W.  · 技术社区  · 14 年前

    我不确定这是否可以在一行中实现(即,不编写脚本),但我想运行一个 ls | grep 命令,然后对于每个结果,将其传递给另一个命令。

    具体地说,我有一个充满图片的目录,我只想查看某些图片。我可以过滤我感兴趣的图像 ls | grep -i <something> eog .

    我试着把结果传给 eog公司 像这样:

    eog $(ls | grep -i <something>)

    eog FILENAME 对于结果列表中的每个条目,而不必将此操作捆绑到脚本中?

    编辑: 如答案所示,我可以使用 for 这样循环:

    for i in 'ls | grep -i ...'; do eog $i; done

    这是可行的,但循环等待迭代,直到我关闭当前打开的 eog公司 实例。

    n 实例 eog公司 一次全部打开,在哪里 是从我的 ls |格雷普

    谢谢大家!

    6 回复  |  直到 4 年前
        1
  •  0
  •   bta    14 年前

    尝试在结果上循环:

    for i in `ls | grep -i <something>`; do
        eog $i
    done
    

    或者你可以用一行字:

    for i in `ls | grep -i <something>`; do eog $i; done
    

    编辑: 如果你想要 eog eog $i & . 更新后的一行字将改为:

    for i in `ls | grep -i <something>`; do (eog $i &); done
    
        2
  •  8
  •   Carl Norum    14 年前

    我会用 xargs :

    $ ls | grep -i <something> | xargs -n 1 eog
    
        3
  •  3
  •   msw    14 年前

    光秃秃的 ls 通过管道传输到grep有点多余 arbitrary?sh*ll-glo[bB] 模式(除非有太多的匹配项不能放在命令行中,在这种情况下 find | xargs

    eog 很乐意接受多个文件名

    eog pr0n*really-dirty.series?????.jpg
    

        4
  •  2
  •   Philipp    14 年前

    使用 find :

    find . -mindepth 1 -maxdepth 1 -regex '...' -exec eog '{}' ';'
    

    find . -mindepth 1 -maxdepth 1 -regex '...' -print0 | xargs -0 -n 1 eog
    

    如果模式不太复杂,则可以进行全局绑定,从而使调用更容易:

    for file in *.png
    do
      eog -- "$file"
    done
    

    Bash还有内置的regex支持:

    pattern='.+\.png'
    for file in *
    do
      [[ $file =~ $pattern ]] && eog -- "$file"
    done
    

    从不使用 ls 在脚本中,从不使用 grep

        5
  •  1
  •   ghostdog74    14 年前
    #!/bin/bash
    shopt -s nullglob
    for image in *pattern*
    do
      eog "$image"
    done
    

    重击4

    #!/bin/bash
    shopt -s nullglob
    shopt -s globstar
    for image in **/*pattern*
    do
        eog "$image"
    done
    
        6
  •  0
  •   carlo    14 年前

    printf "%s\n" {1..10} | xargs -L 5 bash -c 'echo "$@"' arg0
    
    ls | grep -i <something> | xargs -L 5 bash -c 'eog "$@"' arg0