2010-08-09 5 views
1

스크립트를 작성하지 않고 한 줄로 입력 할 수 있는지 확실하지 않지만 ls | grep 명령을 실행 한 다음 각 결과에 대해 다른 명령으로 파이프합니다.한 명령에서 다른 명령으로 여러 결과를 bash로 보내려면 어떻게해야합니까?

구체적으로 말씀 드리면, 이미지가 가득한 디렉토리가 있으며 특정 파일 만보고 싶습니다. 관심있는 이미지를 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 인스턴스를 닫을 때까지 루프가 반복 기다립니다.

이상적으로는 nls | grep 명령에서 반환 된 결과의 수이고, 한 번에 모든를 엽니 다 eogn 인스턴스 싶습니다. 이것이 가능한가?

감사합니다.

+0

위의 명령은 나를 위해 잘 작동합니다. –

답변

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 
+0

주의 사항 : 파일 이름에 공백이 있으면 약간 벗어날 수 있습니다. 그렇다면'ls' +'grep' 대신'find'를 사용하고 그 결과를'xargs'로 파이프하십시오. 이 경우 – bta

+0

쉘 확장을 사용하십시오. – ghostdog74

+2

항상 쉘 확장을 사용하고 절대'ls'을 사용하지 마십시오. – Philipp

8

내가 xargs을 사용합니다 :

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

이것은 발견 된 각 파일의 내용을 grep 할 것이고 grep은 그 파일의 * names *를 grep하지 않을 것입니다. –

+0

죄송합니다. 고정. –

+0

OP는 재귀를 원하지 않는 것 같습니다. 그리고 나서'eog * something *'과 대략 같습니다. – Philipp

1
#!/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

OP는 특히 스크립트가 아닌 솔루션을 요청했습니다. –

+1

대화식 모드에서도이 행을 입력 할 수 있습니다. – Philipp

3

그렙에 파이프 베어 ls 일종의 중복 주어진 arbitrary?sh*ll-glo[bB] 패턴 (명령어 li에 맞는 일치 항목이 너무 많지 않는 한) 이 경우 다른 답변의 find | xargs 조합을 사용해야합니다.

eog 그렇게

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

미세하고 간단 여러 파일 이름을 드리겠습니다.

2

사용 find :

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

배쉬도 : 패턴이 너무 복잡하지 않으면

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

또는

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

다음 글 로빙 훨씬 쉽게 전화를 만드는 것이 가능하다 정규식 지원 내장 :

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

ls을 스크립트에 사용하지 말고 grep을 파일 이름으로 사용하지 마십시오.

0

는 EOG에 전달 된 인수의 수를보다 효율적으로 관리를 원하는 경우에, 당신은 "xargs를이 -L" "bash는 -c"와 함께 사용할 수 있습니다 :

printf "%s\n" {1..10} | xargs -L 5 bash -c 'echo "[email protected]"' arg0 

ls | grep -i <something> | xargs -L 5 bash -c 'eog "[email protected]"' arg0 
관련 문제