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
ファイルごとに1つのコマンドを呼び出すことを意味するため、非常に非効率的です。
zsh
globbingにはglobbingとほぼ同じにする再帰機能と修飾子がありますが、find
残念ながらディレクトリナビゲーションがどのように実行されるかを制御する機能が欠けています。
名前に基づいてディレクトリを整理できます。たとえば、次のようになります。
setopt extendedglob
print -rl -- (^*.pkg/)#*(.)
到着打つ目次*.pkg
ですが、そのディレクトリを整理することはできません。古いまたは、たとえば、このファイルまたはそのファイルが含まれます。これを行うには、手動ディレクトリナビゲーションを実行する必要があります。
find
あなたができることの1つは、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