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

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

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

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

아무것도 반환 하지 않으면 중단됩니다 $(do_something to find filenames). find-command가 재귀 검색을 시작합니다.

인수로 명시적인 파일 이름/디렉터리 이름을 얻지 못한 경우 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

이를 깔끔하게 만들려면 drop find의 오류 출력을 삭제하세요.

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

(그러나 또 다른 오류가 발생하면 알 수 없습니다...).

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

답변4

(그리고 Bourne이 아닌 대부분의 파생 쉘 에서 zsh), (또는모두껍질에 따라 다름)글로브확장되지 않으면 명령이 중단됩니다.

$(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...

관련 정보