検索で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ファイルごとに1つのコマンドを呼び出すことを意味するため、非常に非効率的です。

zshglobbingには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

おすすめ記事