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
, 또는 ,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
이를 깔끔하게 만들려면 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...