我不确定这是否可以在一行中(即,不编写脚本),但我想运行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
个实例一次打开,其中n
是从ls | grep
命令返回的结果数。这可能吗?
谢谢大家!
答案 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