2009-02-22 12 views
5

Ich habe versucht, herauszufinden, wie (schnell) die Anzahl der Dateien auf einem bestimmten HFS + Laufwerk mit Python abrufen.Wie bestimmt man die Anzahl der Dateien auf einem Laufwerk mit Python?

Ich habe mit os.statvfs und so gespielt, aber kann nicht alles bekommen (das scheint mir hilfreich).

Irgendwelche Ideen?

Edit: Lassen Sie mich etwas genauer sein. =]

Ich schreibe einen timemachine-artigen Wrapper um rsync aus verschiedenen Gründen, und möchte eine sehr schnelle Schätzung (muss nicht perfekt sein) der Anzahl der Dateien auf dem Laufwerk rsync wird scannen. Auf diese Weise kann ich den Fortschritt von rsync (wenn Sie es wie rsync -ax --progress oder mit der -P Option aufrufen) beobachten, wie es seine anfängliche Dateiliste erstellt und einen Prozentsatz und/oder ETA zurück an den Benutzer meldet.

Dies ist vollständig getrennt von der eigentlichen Sicherung, was kein Problem bei der Verfolgung des Fortschritts ist. Aber mit den Laufwerken, an denen ich mit mehreren Millionen Dateien arbeite, bedeutet das, dass der Benutzer einen Zähler der Anzahl der Dateien sieht, die für einige Minuten ohne obere Grenze gehen.

Ich habe versucht, mit os.statvfs mit genau der Methode zu spielen, die in einer der Antworten bis jetzt beschrieben ist, aber die Ergebnisse ergeben für mich keinen Sinn.

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

Je mehr tragbare Art und Weise gibt mir um 1,1 Millionen auf dieser Maschine, die die gleiche wie jede andere Anzeige, die ich auf dieser Maschine seine Vorbereitungen laufen, einschließlich rsync gesehen haben:

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

Beachten Sie, dass die erste Methode ist augenblicklich, während die zweite mich 15 Minuten später zum Aktualisieren zurück brachte, weil es nur so lange dauerte, um zu laufen.

Kennt jemand einen ähnlichen Weg, um diese Nummer zu bekommen, oder was ist falsch mit, wie ich die os.statvfs Zahlen behandle/interpretiere?

+0

Wie variiert die Ausgabe von os.statvfs [os.B_FILES] von dem, was Sie erwarten? (Wenn Sie eine Beispielausgabe von os.statvfs einfügen und erklären könnten, warum * es nicht hilfreich ist, würde das Leuten helfen, die OS X nicht kennen, Ihnen zu helfen). –

+0

@Charles: Ich habe meine Frage jetzt mit einigen aktuellen Details aktualisiert ... –

+0

Sie könnten eine Nummer aus einem vorherigen rsync-Lauf verwenden. Es ist schnell, portabel und für 10 ** 6 Dateien und jede vernünftige Backup-Strategie wird es Ihnen 1% oder mehr Präzision geben. – jfs

Antwort

2

Sie eine Nummer aus einem frühen rsync Laufe nutzen könnte. Es ist schnell, tragbar und für 10**6 Dateien und jede vernünftige Backup-Strategie gibt es 1% oder bessere Präzision.

+0

@Sebastian: Du hast das lange vor joeforker im Kommentar gepostet, also bekommst du das Häkchen von mir. –

7

Die richtige Antwort für Ihren Zweck ist, einmal ohne einen Fortschrittsbalken zu leben, speichern Sie die Nummer rsync und nehmen an, Sie haben die gleiche Anzahl von Dateien wie beim letzten Mal für jedes nachfolgende Backup.

glaubte ich es nicht, aber dies scheint auf Linux zu arbeiten:

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

Diese berechnet die Gesamtzahl der Dateiblöcke minus den freien Dateiblöcke. Es scheint Ergebnisse für das gesamte Dateisystem zu zeigen, selbst wenn Sie es auf ein anderes Verzeichnis richten. os.statvfs ist nur unter Unix implementiert.

OK, ich gebe zu, ich habe den "langsamen, korrekten" Weg nicht wirklich beenden lassen, bevor ich an der schnellen Methode staunte. Nur ein paar Nachteile: Ich vermute, .f_files würde auch Verzeichnisse zählen, und das Ergebnis ist wahrscheinlich völlig falsch. Es könnte funktionieren, die Dateien einmal langsam zu zählen und das Ergebnis schnell anzupassen.

Tragbares Weise:

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

os.walk gibt eine 3-Tupel (dirpath, dirnames, Dateinamen) für jedes Verzeichnis in dem Dateisystem an dem gegebenen Pfad beginnt.Dies wird wahrscheinlich lange dauern für "/", aber das wussten Sie schon.

Der einfache Weg:

des Seien wir ehrlich, niemand kennt oder kümmert sich, wie viele Dateien, die sie wirklich haben, ist es eine eintönige und nugatory Statistik. Sie können diese kühlen ‚Anzahl der Dateien‘ -Funktion mit diesem Code zu Ihrem Programm hinzufügen:

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

Lassen Sie uns wissen, wenn eine dieser Methoden für Sie arbeitet.

Siehe How do I prevent Python's os.walk from walking across mount points?

+0

Genau das habe ich im Vorfeld versucht, aber die daraus resultierende Nummer ergibt für mich keinen Sinn. Ich habe die obige Frage präzisiert. –

+0

haha, ich liebe den Humor in der zufälligen Kommentar. –

0

bearbeiten auch: Spotlight nicht jede Datei nicht verfolgt, so seine Metadaten nicht ausreichen.

+0

Ich bin mir ziemlich sicher, dass Spotlight nicht dein ganzes Volumen durchläuft. Ich denke, es bleibt bei/Anwendungen und/Benutzer (und ignoriert Dinge wie ~/Library). –

1

Wenn die Verzeichnisstruktur durchqueren ist eine Option (wäre langsamer als das Laufwerk direkt abfragen):

import os 

dirs = 0 
files = 0 

for r, d, f in os.walk('/path/to/drive'): 
    dirs += len(d) 
    files += len(f)