문제 넌 직면 쉘은 먼저 명령 줄을 구문 분석, 그리고에 의해 분리 된 두 개의 간단한 명령 본다 &&운영자 : 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및 결과 출력이 특히 유용 어쨌든되지 않습니다.)
-exec순서대로 2 를 사용하거나 단일을 사용할 수 있습니다-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;.