Jak ustalić liczbę plików na dysku za pomocą Pythona?


5

Próbowałem dowiedzieć się, jak odzyskać (szybko) liczbę plików na danym dysku HFS + z python.

Gram z os.statvfs i takie, ale nie mogę dostać niczego (to wydaje mi się pomocne).

Wszelkie pomysły?

Edytuj: Pozwól mi być nieco bardziej szczegółowe. =]

Piszę podobne do czasu podobne opakowanie wokół rsync z różnych powodów i chciałbym bardzo szybkiego oszacowania (nie musi być idealne) liczby plików na dysku, które rsync zamierza przeskanować. W ten sposób mogę obserwować postępy z rsync (jeśli nazywasz to jako rsync -ax --progress lub z opcją -P), gdy buduje ona swoją początkową listę plików i raportuje procent i/lub ETA z powrotem do użytkownika.

To jest całkowicie oddzielne od rzeczywistej kopii zapasowej, która nie stanowi problemu w śledzeniu postępu. Ale z napędami, nad którymi pracuję z kilkoma milionami plików, oznacza to, że użytkownik ogląda licznik liczby plików w górę bez górnej granicy przez kilka minut.

Próbowałem grać z os.statvfs dokładnie z metodą opisaną w jednej z dotychczasowych odpowiedzi, ale wyniki nie mają dla mnie sensu.

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

Im bardziej przenośny sposób daje mi około 1,1 miliona na tym komputerze, który jest taki sam jak każdy inny wskaźnik widziałem na tym komputerze, łącznie z rsync działa jej preparatów:

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

Należy pamiętać, że pierwsza metoda jest natychmiastowa, podczas gdy druga sprawia, że ​​wracam 15 minut później, aby zaktualizować, ponieważ trwało to tak długo.

Czy ktoś wie o podobnym sposobie otrzymywania tego numeru lub o tym, co jest nie tak z tym, jak traktuję/interpretuję numery os.statvfs?

  0

W jaki sposób dane wyjściowe pliku os.statvfs [os.B_FILES] różnią się od oczekiwanego? (Jeśli możesz wkleić przykładowe wyniki z os.statvfs i wyjaśnić, * dlaczego * nie jest to pomocne, to pomogłoby to osobom, które nie znają OS X, aby ci pomóc). 22 lut. 092009-02-22 03:54:25

  0

@Charles: Zaktualizowałem moje pytanie z kilkoma aktualnymi informacjami teraz ... 24 lut. 092009-02-24 17:08:29

  0

Możesz użyć numeru z poprzedniego przebiegu rsync. Jest szybki, przenośny, a dla 10 ** 6 plików i rozsądnej strategii tworzenia kopii zapasowych zapewnia dokładność 1% lub lepszą. 24 lut. 092009-02-24 18:25:49

  0

@ J.F .: Zupełnie rację! Powinieneś opublikować to jako faktyczną odpowiedź, więc mogę dać +1. 24 lut. 092009-02-24 21:17:32

2

Można użyć numeru z poprzedniego rsync metę. Jest szybki, przenośny, a dla plików 10**6 i każdej rozsądnej strategii tworzenia kopii zapasowych zapewnia on 1% lub lepszą precyzję.

  0

@Sebastian: Umieściłeś to w komentarzu na długo zanim zrobił to joeforker, więc otrzymałeś od mnie znacznik wyboru. 26 lut. 092009-02-26 18:27:55


7

Właściwa odpowiedź dla twojego celu polega na tym, aby raz żyć bez paska postępu, zapisać numer rsync i założyć, że masz taką samą liczbę plików, jak ostatnio dla każdej kolejnej kopii zapasowej.

nie wierzę, ale to wydaje się działać na Linuksie:

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

ten oblicza łączną liczbę bloków plików minus wolnych bloków plików. Wydaje się pokazywać wyniki dla całego systemu plików, nawet jeśli wskażesz go w innym katalogu. os.statvfs jest zaimplementowany tylko na Uniksie.

OK, przyznaję, tak naprawdę nie pozwoliłem, aby "powolna, prawidłowa" droga zakończyła się, zanim zadziwiła się szybką metodą. Zaledwie kilka wad: podejrzewam, że .f_files zliczyłoby również katalogi, a wynik jest prawdopodobnie całkowicie błędny. Może się zdarzyć, że jeden raz zliczysz pliki w zwolnionym tempie i dopasujesz wynik w "szybki" sposób?

przenośny sposób:

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

os.walk powraca do 3-krotnego (dirpath, dirnames, nazwy plików) dla każdego katalogu w systemie plików, zaczynając w danej ścieżki.Prawdopodobnie zajmie to dużo czasu "/", ale już to wiedziałeś.

Prosty sposób:

Spójrzmy prawdzie w oczy, nikt nie wie, czy to obchodzi, ile plików oni naprawdę mają, to monotonne i bezskuteczny statystyka. Możesz dodać Cool „liczba plików” funkcji do programu z tego kodu:

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

Daj nam znać, jeśli którykolwiek z tych metod działa dla Ciebie.

Zobacz także How do I prevent Python's os.walk from walking across mount points?

  0

To jest dokładnie to, co próbowałem z góry, ale wynikowa liczba nie ma dla mnie sensu. Zmieniłem powyższe pytanie, aby było bardziej szczegółowe. 24 lut. 092009-02-24 17:09:01

  0

haha, uwielbiam humor w losowym komentarzu. 31 paź. 092009-10-31 01:56:43


0

Edycja: Spotlight nie zapisuje każdy plik, więc jego metadane nie wystarczą.

  0

Jestem prawie pewien, że reflektor nie porusza się po całej objętości. Myślę, że to zależy od/Applications i/Users (i ignorowania rzeczy takich jak ~/Library). 23 lut. 092009-02-23 01:09:29


1

Jeśli przejeżdżające drzewo katalogów jest opcją (będzie wolniejszy niż zapytań bezpośrednio na dysk):

import os 

dirs = 0 
files = 0 

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