의 제한 사항입니다 find
. POSIX 표준 의 반환 상태가되도록 지정 find
오류가 디렉토리를 통과하면서 발생하지 않는 0; 실행 된 명령의 반환 상태는 입력되지 않습니다.
명령이 파일이나 설명자에 상태를 쓰도록 할 수 있습니다.
find_status_file=$(mktemp findstatus)
: >"$find_status_file"
find … -exec sh -c 'trap "echo \$?" EXIT; invalid_command "$0"' {} \;
if [ -s "$find_status_file" ]; then
echo 1>&2 "An error occurred"
fi
rm -f "$find_status_file"
또 다른 방법은, 당신이 발견으로 , xargs를 사용하는 것입니다. xargs
명령은 항상 모든 파일을 처리하지만, 상태 1 명령 반환의 제로가 아닌 상태의 경우를 반환합니다.
find … -print0 | xargs -0 -n1 invalid_command
또 다른 방법은 find
쉘에서 재귀 globbing 을 피하고 사용 **/
하는 것입니다. 하위 디렉토리의 깊이를 의미합니다. 여기에는 bash 버전 4 이상이 필요합니다. macOS는 버전 3.x에 고정되어 있으므로 포트 컬렉션에서 설치해야합니다. set -e
0이 아닌 상태를 리턴하는 첫 번째 명령에서 스크립트를 중지하는 데 사용하십시오 .
shopt -s globstar
set -e
for x in **/*.xml; do invalid_command "$x"; done
bash 4.0에서 4.2까지는 작동하지만 디렉토리에 대한 심볼릭 링크를 통과하므로 일반적으로 바람직하지 않습니다.
bash 대신 zsh를 사용하면 재귀 적 글 로빙이 문제없이 작동합니다. Zsh는 기본적으로 OSX / macOS에서 사용할 수 있습니다. zsh에서는 다음과 같이 쓸 수 있습니다.
set -e
for x in **/*.xml; do invalid_command "$x"; done
xargs
접근법은 일반적으로 작동하지만 어떻게 든bash -c
명령을 위반 합니다. 예를 들면 다음과 같습니다find . -name '*.xml' -print0 | xargs -0 -n 1 -I '{}' bash -c "foo {}"
.. 이것은 여러 번 실행되는 반면find . -name '2*.xml' -print0 | xargs -0 -n 1 -I '{}' foo {}
한 번 실행되어 실패합니다. 왜 그런지 알아?