5

Python を使用して、特定の HFS+ ドライブ上のファイル数を (すばやく) 取得する方法を見つけようとしています。

私は os.statvfs などで遊んでいますが、何も得られません (それは私にとって役に立ちます)。

何か案は?

編集:もう少し具体的にさせてください。=]

さまざまな理由で rsync のタイムマシンのようなラッパーを作成していますが、rsync がスキャンしようとしているドライブ上のファイル数の非常に高速な見積もり (完全である必要はありません) が必要です。このようにして、初期ファイルリストを構築するときに rsync からの進行状況を監視し ( のように呼び出した場合rsync -ax --progress、または-Pオプションを使用した場合)、パーセンテージや ETA をユーザーに報告できます。

これは実際のバックアップとは完全に分離されているため、進行状況を追跡するのに問題はありません。しかし、私が数百万のファイルで作業しているドライブでは、ユーザーはファイル数のカウンターが数分間上限なしで上昇するのを見ていることを意味します。

これまでの回答の1つで説明されている方法とまったく同じ方法でos.statvfsを試してみましたが、結果は意味がありません。

>>> import os
>>> os.statvfs('/').f_files - os.statvfs('/').f_ffree
64171205L

より移植性の高い方法では、このマシンで約 110 万になります。これは、準備を実行している rsync を含め、このマシンで見た他のすべてのインジケーターと同じです。

>>> sum(len(filenames) for path, dirnames, filenames in os.walk("/"))
1084224

最初の方法はすぐに実行できることに注意してください。2 番目の方法では、実行に 15 分ほどかかったので、更新するために 15 分後に戻ってきました。

この番号を取得する同様の方法を知っている人はいますか、または os.statvfs 番号の処理/解釈方法の何が問題になっていますか?

4

4 に答える 4

7

あなたの目的に対する正しい答えは、一度プログレスバーなしで生活し、rsync が思いついた数を保存し、連続するバックアップごとに前回と同じ数のファイルがあると仮定することです。

信じられませんでしたが、これは Linux で動作するようです:

os.statvfs('/').f_files - os.statvfs('/').f_ffree

これにより、ファイル ブロックの総数から空きファイル ブロックを差し引いた数が計算されます。別のディレクトリを指定しても、ファイルシステム全体の結果が表示されるようです。os.statvfs は Unix でのみ実装されています。

OK、認めますが、実際には「ゆっくりとした正しい」方法を終了させて​​から、高速な方法に驚嘆しませんでした。いくつかの欠点:.f_filesディレクトリもカウントすると思われますが、結果はおそらく完全に間違っています。ファイルを遅い方法で1回カウントし、「速い」方法で結果を調整するとうまくいくかもしれませんか?

ポータブルな方法:

import os
files = sum(len(filenames) for path, dirnames, filenames in os.walk("/"))

os.walk指定されたパスから始まるファイルシステム内の各ディレクトリの 3 タプル (dirpath、dirnames、filenames) を返します。これにはおそらく長い時間がかかり"/"ますが、それはすでにご存知のとおりです。

簡単な方法:

正直に言って、実際にいくつのファイルを持っているかは誰も知りませんし、気にも留めていません。次のコードを使用して、このクールな「ファイル数」機能をプログラムに追加できます。

import random
num_files = random.randint(69000, 4000000)

これらの方法のいずれかが機能するかどうかをお知らせください。

Python の os.walk がマウント ポイントを通過しないようにするにはどうすればよいですか?も参照してください。

于 2009-02-22T03:37:47.677 に答える
2

以前のrsync実行からの番号を使用できます。高速で移植性があり、10**6ファイルや合理的なバックアップ戦略の場合1%、精度が向上します。

于 2009-02-25T11:20:23.530 に答える
1

ディレクトリ ツリーをトラバースするオプションがある場合 (ドライブを直接クエリするよりも遅くなります):

import os

dirs = 0
files = 0

for r, d, f in os.walk('/path/to/drive'):
  dirs += len(d)
  files += len(f)
于 2009-02-23T11:23:55.067 に答える
0

編集: Spotlight はすべてのファイルを追跡するわけではないため、そのメタデータでは不十分です。

于 2009-02-22T03:42:55.620 に答える