まず、Unixに関する知識が不足していることをお許しください。だからこそ私はここにいるのです。 Macでファイルを検索するAppleScriptを作成し、次のコマンドを使用して速度を大幅に向上させました。
set MySubfolderTextList to do Shell script "find " & MyDirectory & " -type d"
プレーンUnixでは、それはfind MyDirectory -type d
これにより、MyDirectory
というフォルダーのトップレベルから再帰的に開始するすべてのサブフォルダーのリストが表示されます。これの速度は、通常のAppleScriptで作成した古いルーチンと比較して驚くべきものですが、何千ものサブディレクトリがあるフォルダーでこのスクリプトを実行すると、数秒または数分間小さなビーチボールが表示されます。何かが起こっているか、システムがクラッシュしました。検索の進行状況についてUnixからフィードバックを得ることができると期待していました。そうしないと、クライアントはプログラムがクラッシュしたことに気が狂います。
あんまり。 findはディレクトリツリーに何があるかを知らないが、すべてのディレクトリリストを再帰的に読み取ることによって見つけることを考慮してください。 (駄洒落で申し訳ありません。)たとえば、2つの第1レベルのディレクトリがあり、そのうちの1つには1つのファイルがあり、もう1つには1000000のファイルがあります。
プログラムは最初にツリーを検索してすべてのファイルの数とサイズを見つけ、それを使用して完了を見積もることができるため、ツリーをコピーするようなものは異なります。ファイルサイズは明示的に保存されるため、これを行うことができます。サイズを見つけるためにファイル全体を読み取る必要はありません。しかし、私が知る限り、ツリー内のファイル数に関する情報を保存する一般的なファイルシステムはありません。 (不可能というわけではありませんが、一部のシステムでそれが行われたとしても、情報を使用するにはfindを変更する必要があります。)
さて、ビーチボールとフリーズの印象については、実行中にUIがブロックされるように、サブプロセスを同期して実行していますか?これは通常は悪い考えであり、外部プログラムをバックグラウンドで実行する方法を検索し、「まだ検索中です...」というメッセージを表示することをお勧めします。ユーザーが焦った場合に検索を中止するオプションがあります。
行数をカウントする場合は、pv
コマンドを使用できます。例えば
find ~ -type d | pv -l -F '%b dirs found' >/tmp/output