답변:
이 데모에서는 첫 번째 sh -c 'echo first; false'
(또는 true
)를 사용합니다 -exec
. 그러면 일부 출력이 제공되고 선택된 종료 코드 효과도 있습니다. 그런 다음 echo second
두 번째에 사용됩니다. 현재 디렉토리에 하나의 파일이 있다고 가정하십시오.
$ find . -type f -exec sh -c 'echo first; false' \; -exec echo second \;
first
$ find . -type f -exec sh -c 'echo first; true' \; -exec echo second \;
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
이 유형의 실제 명령은 다음과 같습니다.
find . -type f \( -exec command1 \; -false -o -exec command2 \; \)
두 번째 세트에서 이스케이프 된 괄호는 두 -exec
절을 그룹화합니다 . -false
사이에는 "FALSE"이고 위해 시험 상태 강제 -o
원인은 다음 식 (제를 -exec
때문으로 평가 함) -false
.
보낸 사람 man find
:
expr1 expr2
행의 두 표현식은 내포 된 "and"로 결합됩니다. expr1이 false이면 expr2는 평가되지 않습니다.expr1 -a expr2 expr1 expr2
와 동일합니다.expr1 -o expr2
또는; expr1이 true이면 expr2는 평가되지 않습니다.
cmd1이 오류 코드로 인해 cmd2가 실행되는 것을 막을 수 있는지에 대해 중요하지 않은 경우 0
:
find . -exec cmd1 \; -exec cmd2 \;
두 명령을 항상 실행하는 신뢰할 수있는 유일한 방법은 명령을 find
순차적으로 실행하는 쉘을 호출하는 것입니다.
find . -exec bash -c 'cmd1; cmd2' filedumper {} \;
cmd1 및 cmd2를 수행하는 스크립트를 작성하는 것이 마음에 들지 않으면 다음과 같습니다.
find . -exec myscript {} \;
또는
find . -exec myscript {} +
사용하다 \; 또는 + myscript가 한 번에 두 개 이상의 파일을 처리 할 수 있는지 여부에 따라 (파일 이름에 공백이 있으면 털이 나타남)
내 경험에 따라 스크립트에서 수행 한 작업을 수행하는 것은 거의 항상 가치가 있습니다. 한 번만해야하는 경우 다시해야합니다.
그러나 깔끔한 트릭은 찾기 를 스크립트 안에 넣는 것입니다 .
if [ $# -gt 0 ]; then
for each; do
touch $each
done
else
find . -exec $0 {} +
fi
그런 다음 myscript는 작업하기 위해 인수로 제공하는 모든 파일에서 작동하지만 인수를 제공하지 않으면 현재 디렉토리에서 찾은 다음 찾은 파일에서 자신을 호출합니다. 이것은 find -exec가 스크립트에서 정의한 쉘 함수를 호출 할 수 없다는 사실을 해결합니다.
-o
.