find: 파일이 지정되지 않으면 아무것도 하지 않습니다.

find: 파일이 지정되지 않으면 아무것도 하지 않습니다.

find특정 파일 이름에 대해 use를 호출 하고 싶습니다 .

find $(do_something to find filenames) -print0 | xargs -r0 ls -ld

아무것도 반환되지 않으면 중단됩니다 $(do_something to find filenames). find 명령은 재귀 검색을 시작합니다.

인수로 명시적인 파일 이름/디렉터리 이름 없이 find에게 아무것도 하지 않도록 지시하는 방법이 있습니까?

답변1

그걸로 zsh나는 이렇게 할 것이다:

files=($(do_something to find filenames))
(($#files)) && find $files ...

그리고 tcsh:

set files=(`do_something to find filenames`)
if ($#files) find $files:q ...

bash, 또는 ,mkshksh93

set -f; files=($(do_something to find filenames))
((${#files[@]})) && find "${files[@]}" ...

POSIX적으로:

set -f; set -- $(do_something to find filenames)
[ "$#" -gt 0 ] && find "$@" ...

(Bash 및 기타 POSIX 셸에서는 $(...)분할( $IFS기본적으로 공백, 탭 및 줄바꿈)을 수행하지만 결과 단어에 와일드카드도 수행합니다. 여기서는 필요하지 않을 것으로 예상하므로 set -f. 기타 셸((t) csh, zsh, fish, rc, es...)에는 이 문제가 없습니다).

답변2

이렇게 하면 어떨까요?

paths=$(do_something to find filenames)
if [ "$paths" ]; then
    find "$paths" ...
fi

이는 find구현과 관련이 없습니다.

여러 경로 이름을 사용 하면 find "$paths"문제가 발생할 수 있습니다. 경로 이름에 공백이 없으면 다음을 사용할 수 있습니다. find $paths그렇지 않으면 다음 함수를 사용할 수 있습니다.

dofind() {
    set -f
    set -- $(do_something to find filenames)
    if [ $# -gt 0 ]; then
        find "$@" ...
    fi
    set +f
}

파일 글로빙을 비활성화한 다음 set --쉘 인수 벡터를 설정하는 데 사용됩니다. 이는 모든 POSIX 쉘에서 작동합니다.

답변3

다음과 같이 존재하지 않는 추가 디렉터리를 제공하여 find시작할 수 있습니다.

find " " $(do_something to find filenames) -print0 | xargs -r0 ls -ld

이를 깔끔하게 만들기 위해 finddrop의 오류 출력은 다음과 같습니다.

find " " $(do_something to find filenames) -print0 2>/dev/null | xargs -r0 ls -ld

(그러나 또 다른 오류가 발생하면 눈치 채지 못할 것입니다...).

do_something to find filenames파일 이름을 출력할 때 find불만이 표시되지만 " "나머지 명령줄은 계속 처리됩니다. 파일 이름이 출력되지 않으면 find다시 불평 " "하지만 기본값은 추가되지 않습니다 ..

답변4

zsh(그리고 Bourne에서 파생되지 않은 대부분의 쉘 에서 ), 언제 (또는모두쉘에 따라 다름)전반적인 상황확장하지 않으면 명령이 중단됩니다.

$(do_something to find filenames)glob은 아니지만 다음에 glob 한정자를 추가하여 glob으로 만들 수 있습니다 zsh.

 find $(do_something to find filenames)(#q) -print0...

위에서는 (#q)(빈 glob 한정자이므로 다른 작업은 수행하지 않음) 출력 분할의 마지막 단어에 추가되므로 do_something to find filenames명령이 출력을 생성하지 않거나 공백인 경우 명령은 중단되지만 마지막 단어(및 마지막 단어만)은 기존 경로로 확인되지 않습니다. 이를 분할로 생성된 모든 단어에 적용할 수 있습니다. 따라서 해당 단어 중 하나라도 기존 파일로 구문 분석되지 않으면 명령이 중단됩니다.

 find ${^$(do_something to find filenames)}(#q) -print0...

관련 정보