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

时间:2010-08-09 17:43:14

标签: linux bash unix shell

我不确定这是否可以在一行中(即,不编写脚本),但我想运行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实例。

理想情况下,我希望neog个实例一次打开,其中n是从ls | grep命令返回的结果数。这可能吗?

谢谢大家!

6 个答案:

答案 0 :(得分:8)

我会使用xargs

$ ls | grep -i <something> | xargs -n 1 eog

答案 1 :(得分:3)

ls管道输入grep是一种冗余的给定arbitrary?sh*ll-glo[bB]模式(除非有太多匹配适合命令行,在这种情况下find | xargs组合在其他答案中应该使用。

eog很乐意接受多个文件名

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

很简单。

答案 2 :(得分:2)

使用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也有内置的正则表达式支持:

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

切勿在脚本中使用ls,也不要使用grep来过滤文件名。

答案 3 :(得分:1)

#!/bin/bash
shopt -s nullglob
for image in *pattern*
do
  eog "$image"
done

Bash 4

#!/bin/bash
shopt -s nullglob
shopt -s globstar
for image in **/*pattern*
do
    eog "$image"
done

答案 4 :(得分:0)

尝试循环结果:

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

答案 5 :(得分:0)

如果您想要更多地控制传递给eog的参数数量,可以将“xargs -L”与“bash -c”结合使用:

printf "%s\n" {1..10} | xargs -L 5 bash -c 'echo "$@"' arg0

ls | grep -i <something> | xargs -L 5 bash -c 'eog "$@"' arg0