2012-02-28 1 views
8

특정 문자열이 포함 된 파일이 있습니다. 내가하고 싶은 일은 파일의 위치를 ​​검색하는 것입니다. 패턴에 grep 파일이 존재하면; 사실이라면 무언가를하십시오.xargs - 조건과 echo {}

find -iname file.xxx| xargs -I {} if grep -Fq "string" {} ; then echo {} ; fi 

문제는 다음과 같습니다

  • xargs는 경우 문을 작동하지 않습니다.
  • echo {}은 파일 이름을 제공하지 않으며 대신 {}을 제공합니다.

어떻게 수정합니까?

+0

왜'find' 실행 '이없는 그 자체를 grep'? –

+0

파일이나 삐걱 거리는 선에서 뭔가를 할 수 있습니까? –

답변

18

이 같은 쉘을 통해 명령어를 실행 해보십시오 : 원래 명령이 시세 및 bash -c에 의해 포위 된

$ find -iname file.xxx | 
> xargs -I {} bash -c 'if grep -Fq "string" {} ; then echo {} ; fi' 

.

5

랩 쉬를 호출의 경우 문 :

find -iname file.xxx | xargs -I {} sh -c 'grep -Fq "string" {} && { echo {}; }' 

사용 동안 루프 대신 xargs를

find -iname file.xxx | while read -r file; do 
    if grep -Fq "$file"; then 
    # do something 
    echo "$file" 
    fi 
done 

난 당신이 파일 이름을 에코 것보다 더 많은 일을 할 가정합니다.

find -iname file.xxx | xargs grep -Fl "string" 
0

첫째, if이 떠들썩한-명령없이 실행 가능한 프로그램입니다 : 그것은 당신이하려는 모든 있다면, 그렙의 -l 옵션을 사용합니다. 반면에 xargs에는 별개의 프로그램이 필요합니다.

두 번째로 ; 문자가 사용자의 명령을 분할하고 있습니다. 당신은 xargs에 throu를 얻기 위하여 그 (것)들을 도주해야 할 것입니다. 다음 내가 제안이 모든 것을 방지하기 위해

:

for i in `find -iname file.xxx` ; do grep -Fq "string" $i && echo $i ; done 
+2

일반적으로 for-loop는 공백이있는 find-filenames의 출력을 워드 분할하는 방식으로 분할하지 않는 것이 좋습니다. 파일 이름을 읽으려면 while 루프를 사용하는 것이 좋습니다. –

+0

좋은 지적. 항상 공백을주의하십시오! – Quota

-1
find -iname file.xxx | while read FILE; do 
if grep -Fq "string" $FILE ; then echo $FILE ; 
done 
+0

이 답변은 길이와 내용 때문에 저품질로 표시되었습니다. 그것이하는 일에 대한 설명을 추가하고 질문에 어떻게 답하는지 제안하십시오. –