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
, 또는 ,mksh
ksh93
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
이를 깔끔하게 만들기 위해 find
drop의 오류 출력은 다음과 같습니다.
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...