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 기능은 명령이 아닙니다.
find
zsh
함수의 코드를 설명 해야 합니다 . 이렇게 하려면 zsh
함수의 코드를 로드하고 찾은 파일을 사용하여 실행하도록 지시하는 방식으로 호출해야 합니다. 예를 들어 다음과 같이 할 수 있습니다.
find ... -exec zsh -c "(){$functions[finderpackage];}"' "$@"' zsh {} \; ...
(위에서 우리는 내용이 익명 함수( )를 사용하는 zsh
인라인 스크립트( )를 사용하여 호출을 수행했습니다. 여기서 코드는 명령을 호출한 셸의 함수 코드에서 복사 됩니다 .-c
(){code} args
finderpackage
find
그러나 이는 zsh
파일당 하나의 명령을 호출하는 것을 의미하므로 매우 비효율적입니다.
zsh
globbing에는 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