find-exec 와 함께 호출되는 두 개의 쉘 명령을 논리적으로 결합하는 방법이 있습니까?
예를 들어 문자열 foo를 포함하는 모든 .csv 파일을 해당 항목과 함께 인쇄 하려면 다음과 같이하십시오.
find . -iname \*.csv -exec grep foo {} && echo {} \;
하지만 배쉬는 ” ‘간부’에 인수 누락”로 불평
답변
-exec
쉘이 아닌 명령을 실행하고 명령 결과 (0 또는 0이 아닌 종료 상태)에 따라 true 또는 false로 평가되는 술어입니다 .
그래서:
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 i do
grep foo "$i" && echo "$i"
done' sh {} +
답변
문제 넌 직면 쉘은 먼저 명령 줄을 구문 분석, 그리고에 의해 분리 된 두 개의 간단한 명령 본다 &&
운영자 : find . -iname \*.csv -exec grep foo {}
와 echo {} \;
. 인용하는 것은 &&
( find . -iname \*.csv -exec grep foo {} '&&' echo {} \;
) 그것을 무시하지만, 지금에 의해 실행 된 명령은 find
같은 것입니다 grep
인수와 foo
, wibble.csv
, &&
, echo
및 wibble.csv
. 연산자 find
를 해석 할 쉘을 실행 하도록 지시해야합니다 &&
.
find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;
이후의 첫 번째 인수 sh -c SOMECOMMAND
는 $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 {} \;
(나는 가정 grep
하고 echo
같은 그림의 목적을 위해 단지이다 -exec echo
로 대체 될 수 -print
및 결과 출력이 특히 유용 어쨌든되지 않습니다.)
답변
이 특정한 경우에 나는 할 것이다 :
find . -iname \*.csv -exec grep -l foo \{\} \;
또는 ack 가있는 경우 :
ack -al -G '.*\.csv' foo
실제 질문에 대답하기 위해 다음과 같이 작동 할 수 있습니다.
find . -iname \*.csv -exec sh -c "grep foo {} && echo {}" \;