2009-02-22 70 views
5

私は、Pythonで特定のHFS +ドライブ上のファイル数を(素早く)検索する方法を見つけようとしています。Pythonでドライブ上のファイル数を調べる方法は?

私はos.statvfsなどで遊んでいますが、何も得られません。

アイデア?

編集:もう少し具体的にしましょう。 =]

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

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

これまでの回答の1つに記載されているメソッドとまったく同じos.statvfsを試してみましたが、結果は意味をなさないものです。

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

よりポータブルな方法は、rsyncを実行し、その準備を含め、私はこのマシン上で見てきた他のすべての指標と同じで、このマシン上で私の周りに110万を与える:

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

。なお、最初の方法は瞬間的なものですが、2番目の方法は15分後に更新されるようになりました。

この番号を取得するのと同様の方法を知っている人はいますか、os.statvfsの番号をどのように扱い/解釈しているのですか?

+0

os.statvfs [os.B_FILES]の出力は、期待どおりにどのように変化しますか? (os.statvfsのサンプル出力を貼り付けることができ、それが役に立たない理由を説明すれば、それはOS Xを知らない人を助けるでしょう)。 –

+0

@Charles:実際の詳細で質問を更新しました... –

+0

以前のrsync実行の番号を使用できます。それは速く、移植性があり、10 ** 6ファイルおよび任意の合理的なバックアップ戦略のために、それはあなたに1%またはそれ以上の精度を与えるでしょう。 – jfs

答えて

2

あなたは以前rsync実行から数を使用することができます。それは速く、移植性があり、10**6ファイルおよび任意の合理的なバックアップ戦略のために1%またはそれ以上の精度を与えるでしょう。

+0

@セバスチャン:あなたはjoeforkerがやって来るずっと前にこのコメントを投稿したので、あなたは私からチェックマークを得る。 –

7

あなたの目的に合った答えは、プログレスバーを一度も使わずにrsyncの番号を保存しておき、連続するバックアップごとに前回と同じ数のファイルがあると仮定することです。

私はそれを信じていなかったが、これはLinux上で動作するようです:

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

これは、ファイルブロックの合計数を引いフリーファイルブロックを計算します。たとえあなたが別のディレクトリを指していても、ファイルシステム全体の結果を示すようです。 os.statvfsはUnix上でのみ実装されています。

[OK]を、私は実際には、高速メソッドで驚く前に、「遅く、正しい」方法を終了させませんでした。ほんの少しの欠点:私は.f_filesもディレクトリを数えると思われ、結果はおそらく完全に間違っています。遅いやり方でファイルを一度カウントし、結果を「速い」方法で調整するのに役立つかもしれませんか?

ポータブル方法:

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

指定されたパスから始まるファイルシステム内の各ディレクトリの3タプル(DIRPATH、にdirnames、ファイル名)を返しos.walk。これはおそらく"/"のために長い時間がかかるでしょうが、あなたは既にそれを知っていました。

簡単な方法:

それに直面しよう、誰もそれが平凡とnugatory統計だ、彼らは本当に持っているどのように多くのファイルが知っているか気に。このコードを使用して、このクールな「ファイル数」機能をプログラムに追加することができます。

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

これらの方法が有効な場合は、お知らせください。

も参照してくださいHow do I prevent Python's os.walk from walking across mount points?

+0

これはまさに私が前向きな試みをしていたものですが、結果の数字は私には意味がありません。上記の質問をより具体的に編集しました。 –

+0

haha​​、私はランダムなコメントのユーモアが大好きです。 –

0

編集:スポットライトは、すべてのファイルを追跡していないので、そのメタデータが十分ではありません。

+0

私はスポットライトがあなたの全容積を歩かないと確信しています。私はそれが/ Applicationsと/ Users(そして〜/ Libraryのようなものは無視する)に固執すると思います。 –

1

ディレクトリツリーを横断するオプション(直接ドライブを照会よりも遅くなります)の場合:

import os 

dirs = 0 
files = 0 

for r, d, f in os.walk('/path/to/drive'): 
    dirs += len(d) 
    files += len(f) 
関連する問題