문제 넌 직면 쉘은 먼저 명령 줄을 구문 분석, 그리고에 의해 분리 된 두 개의 간단한 명령 본다 &&
운영자 : 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"' {} \;
.