Как отправить несколько результатов из одной команды в другую в bash? - PullRequest
1 голос
/ 09 августа 2010

Я не уверен, возможно ли это в одной строке (т. Е. Без написания скрипта), но я хочу запустить команду 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. Это возможно?

Спасибо всем!

Ответы [ 6 ]

8 голосов
/ 09 августа 2010

Я бы использовал xargs:

$ ls | grep -i <something> | xargs -n 1 eog
3 голосов
/ 09 августа 2010

Голый ls, переданный в grep, является своего рода избыточным с учетом arbitrary?sh*ll-glo[bB] шаблонов (если только не найдется слишком много совпадений для командной строки, в этом случае следует использовать комбинации find | xargs в других ответах.

eog рад принять несколько имен файлов, поэтому

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

удобнее и проще.

2 голосов
/ 09 августа 2010

Используйте 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 для фильтрации имен файлов.

1 голос
/ 09 августа 2010
#!/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
0 голосов
/ 11 августа 2010

Если вы хотите больше контролировать количество аргументов, передаваемых в 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
0 голосов
/ 09 августа 2010

Попробуйте перебрать результаты:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...