bash - 무엇을 할 수 있나요: find .... -이 && 저것을 실행할까요?

bash - 무엇을 할 수 있나요: find .... -이 && 저것을 실행할까요?

두 개의 쉘 명령을 논리적으로 결합하는 방법이 있습니까?찾기-실행?

예를 들어 모두 인쇄해 보세요..csv문자열 foo와 해당 발생 횟수가 포함된 파일을 사용하여 다음을 수행하고 싶습니다.

find . -iname \*.csv -exec grep foo {} && echo {} \;

하지만세게 때리다"'-exec' 인수 누락"에 대해 불평합니다.

답변1

-exec셸이 아닌 명령을 실행하고 결과를 계산하는 조건자입니다.진짜또는잘못된명령 결과(0 또는 0이 아닌 종료 상태)를 기준으로 합니다.

그래서:

find . -iname '*.csv' -exec grep foo {} \; -print

회의인쇄grep파일에 foo가 있는 경우 파일 경로입니다. 대신 다른 술어나 다른 술어를 -print사용할 수 있습니다 .-exec

find . -iname '*.csv' -exec grep foo {} \; -exec echo {} \;

음수 합계에 대한 연산자 도 참조 !하고 찾아보세요.-o또는.

또는 다음과 같이 셸을 시작할 수 있습니다.

find . -iname '*.csv' -exec sh -c '
   grep foo "$1" && echo "$1"' sh {} \;

또는 각 파일에 대해 쉘을 시작하지 마십시오.

find . -iname '*.csv' -exec sh -c '
  for file do
    grep foo "$file" && echo "$file"
  done' sh {} +

답변2

직면한 문제는 쉘이 먼저 명령줄을 구문 분석하고 &&연산자로 구분된 두 개의 간단한 명령( find . -iname \*.csv -exec grep foo {}, 및 ) 을 본다는 것입니다 echo {} \;. ( )를 인용하면 &&이를 무시 find . -iname \*.csv -exec grep foo {} '&&' echo {} \;하지만 이제 , 및 인수를 사용하여 유사한 find명령 을 실행합니다 . 이 연산자를 해석하는 쉘을 실행하도록 지시해야 합니다 .grepfoowibble.csv&&echowibble.csvfind&&

find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;

sh -c SOMECOMMANDis 뒤의 첫 번째 매개변수 $0는 가 아닙니다 $1.

처리를 용이하게 하려면 파일 이름을 열거 할 수 -exec … +있도록 일부 더미 값을 전달하세요 .$0"$@"

find . -iname \*.csv -exec sh -c 'for x in "$@"; do grep foo "$x" && echo "$x"; done' \ {} +

쉘 명령이 두 개의 프로그램으로 분리된 두 개의 프로그램인 경우 &&이를 find직접 수행할 수 있습니다. 두 개의 연속 -exec작업을 작성하고 첫 번째 작업이 상태 0으로 종료되는 경우에만 두 번째 작업을 실행합니다.

find . -iname \*.csv -exec grep foo {} \; -exec echo {} \;

(나는 단지 설명을 위한 목적으로 grepand 를 사용하고 and 로 대체할 수 있다고 가정합니다 . 결과 출력은 어쨌든 특별히 유용하지 않습니다.)echo-exec echo-print

답변3

이 특별한 경우에는 다음과 같이 합니다.

find . -iname \*.csv -exec grep -l foo \{\} \;

아니면 당신이 가지고 있다면확인하다:

ack -al -G '.*\.csv' foo

실제 질문에 답하려면 다음과 같이 하면 됩니다.

find . -iname \*.csv -exec sh -c "grep foo {} && echo {}" \;

관련 정보