찾기에서 zsh 기능을 사용하시겠습니까?

찾기에서 zsh 기능을 사용하시겠습니까?

finderpackage저는 Finder를 기반으로 폴더가 실제로 "패키지"("패키지"라고도 다소 잘못 불림)인지 확인하려고 시도하는 OS X에서 호출되는 함수를 정의했습니다 .

내 의도는 find이러한 폴더에 대한 액세스를 제한하는 것인데, 이는 때때로 유용합니다.

응용 프로그램은 실제로 폴더인 응용 프로그램, 프레임워크, 문서 형식으로 작업하고 Finder와 마찬가지로 단일 "파일"과 유사하게 하위 트리에서 파일 크기를 찾습니다.

find . -xdev \( -exec finderpackage {} \; -exec du -sk {} \; -prune \) -or \( -type f -exec du -k {} \; \)

그러나 이 예는 find다음에 대해 불평한 대로 작동하지 않습니다.find: finderpackage: No such file or directory

이런 식으로 zsh 기능을 사용할 수 없나요?

(물론 이것을 스크립트로 다시 작성할 수도 있습니다. 함수 사용 방법에 대해 뭔가 빠진 것이 있는지 궁금합니다.)

답변1

함수는 쉘 언어의 기능입니다. /bin/zsh그것은 명령이자 zsh언어의 해석자이다. find파일을 찾기 위해 설계된 또 다른 명령입니다. 그래 -exec그거야구현하다주문. zsh 기능은 명령이 아닙니다.

findzsh함수의 코드를 설명 해야 합니다 . 이렇게 하려면 zsh함수의 코드를 로드하고 찾은 파일을 사용하여 실행하도록 지시하는 방식으로 호출해야 합니다. 예를 들어 다음과 같이 할 수 있습니다.

find ... -exec zsh -c "(){$functions[finderpackage];}"' "$@"' zsh {} \; ...

(위에서 우리는 내용이 익명 함수( )를 사용하는 zsh 인라인 스크립트( )를 사용하여 호출을 수행했습니다. 여기서 코드는 명령을 호출한 셸의 함수 코드에서 복사 됩니다 .-c(){code} argsfinderpackagefind

그러나 이는 zsh파일당 하나의 명령을 호출하는 것을 의미하므로 매우 비효율적입니다.

zshglobbing에는 globbing과 거의 동일하게 만드는 재귀 기능과 한정자가 있지만 find불행하게도 디렉토리 탐색이 임의의 방식으로 수행되는 방식을 제어하는 ​​기능이 부족합니다.

이름을 기준으로 디렉터리를 정리할 수 있습니다. 예를 들면 다음과 같습니다.

setopt extendedglob
print -rl -- (^*.pkg/)#*(.)

도착하다치다목차 *.pkg​하지만 해당 디렉토리를 정리할 수는 없습니다.오래된또는 예를 들어 이 파일이나 해당 파일을 포함합니다. 이렇게 하려면 수동 디렉터리 탐색을 수행해야 합니다.

find당신이 할 수 있는 한 가지는 a로 상호 작용하여 coproc사용하는 것입니다. 하지만 이 방법도 그리 효율적이지는 않습니다 -ok.

coproc stdbuf -o0 find . -type f -exec printf 'f:%s\0' {} \; -o \
  -type d -exec printf 'd:%s\0' {} \; -ok true \; -prune 2> /dev/null
while IFS=: read -rpd '' type file; do
  case $type in
    (d)
      if finderpackage $file; then
        print -p y
        du -sk $file
      else
        print -p n
      fi;;
    (f)
      du -k $file
  esac
done

관련 정보