Python ile bir sürücüdeki dosya sayısı nasıl belirlenir?


5

Belirli bir HFS + sürücüsündeki python ile dosya sayısını nasıl alacağınızı (hızlıca) anlamaya çalışıyorum.

Ben os.statvfs ve benzeri ile oynuyordum, ama hiçbir şey alamıyorum (bana yararlı görünüyor).

Herhangi bir fikrin var mı?

Düzelt: Biraz daha belirgin olalım. =]

Çeşitli nedenlerden dolayı rsync etrafında bir timemachine benzeri bir sarmalayıcı yazıyorum ve rsync'nin taranacağı dosya sayısının çok hızlı bir tahminini (mükemmel olması gerekmez) istiyorum. Bu şekilde, rsync'den (rsync -ax --progress veya -P seçeneği ile çağırırsanız) ilerlemesini ilk dosya listesini oluşturduğundan ve bir yüzdeyi ve/veya ETA'yı kullanıcıya geri bildirdiğinden izleyebilirim.

Bu, asıl yedeklemeden tamamen ayrıdır; Ancak birkaç milyon dosya üzerinde çalıştığım sürücülerle, kullanıcının birkaç dakika boyunca hiçbir üst sınırı olmayan dosya sayısının bir sayacını izlediği anlamına geliyor.

os.statvfs ile tam olarak şu ana kadar verilen yanıtlardan birinde anlatılan yöntemi kullanarak oynamaya çalıştım, ancak sonuçlar bana mantıklı gelmiyor.

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

daha taşınabilir yolu rsync çalışan hazırlıklarını dahil bu makinede hâlâ her diğer gösterge, aynı bu makinede, beni yaklaşık 1,1 milyon verir:

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

Not o İlk yöntem anlık, ikincisi ise 15 dakika sonra geri dönmemi sağladı.

Bu numarayı almak için benzer bir yoldan haberiniz var mı, yoksa os.statvfs numaralarını nasıl ele aldığımı/yorumladığım konusunda yanlış olan nedir?

  0

Os.statvfs [os.B_FILES] çıktısı beklediğinizden nasıl değişir? (Eğer os.statvfs'den örnek çıktılarını yapıştırabilir ve * neden * yardımcı olmadığını açıklarsanız, bu size yardım etmek için OS X'i bilmeyen kişilere yardımcı olacaktır). 22 şub. 092009-02-22 03:54:25

  0

@Charles: Sorumu şu anda bazı gerçek detaylarla güncelledim ... 24 şub. 092009-02-24 17:08:29

  0

Bir önceki rsync çalışmasından bir numarayı kullanabilirsiniz. Bu hızlı, taşınabilir ve 10 ** 6 dosya ve herhangi bir makul yedekleme stratejisi için size% 1 veya daha iyi hassasiyet verecektir. 24 şub. 092009-02-24 18:25:49

  0

@ J.F. Oldukça doğru! Bunu gerçek bir cevap olarak göndermelisin, böylece ona bir +1 verebilirim. 24 şub. 092009-02-24 21:17:32

2

Bir önceki rsync vadede bir numarayı kullanabilirsiniz. Hızlı, taşınabilir ve 10**6 dosyaları ve size 1% veya daha iyi hassasiyet verecek makul bir yedekleme stratejisi.

  0

@Sebastian: Bunu joeforker'ın yaptığı yorumdan önce gönderdiniz, böylece onay işaretini benden alıyorsunuz. 26 şub. 092009-02-26 18:27:55


7

Amacınız için doğru yanıt, bir kez ilerleme çubuğu olmadan yaşamak, rsync sayısı ile birlikte depolamak ve her bir yedek yedek için son kez aynı sayıda dosya olduğunu varsayalım.

Ben inanmadım, ama bu Linux üzerinde iş gibi görünüyor:

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

Bu dosya blokları eksi ücretsiz dosya blokların toplam sayısını hesaplar. Başka bir dizinde işaret etseniz bile tüm dosya sistemi için sonuçları gösterir gibi görünüyor. os.statvfs yalnızca Unix'te uygulanır.

Tamam, itiraf etmeliyim ki, hızlı yönteme hayret etmeden önce 'yavaş, doğru' bir şekilde sonuçlanmadı. Sadece birkaç dezavantajı: .f_files'un da dizin sayılacağından şüpheleniyorum ve sonuç muhtemelen tamamen yanlıştır. Dosyaları bir kez yavaşça saymak ve sonucu 'hızlı' şekilde ayarlamak işe yarayabilir mi?

taşınabilir bir şekilde:

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

os.walk verilen yol başlayarak dosya sisteminde, her bir dizin için bir 3-tuple (dizinyolu, dirnames, dosya) döndürür.Bu muhtemelen "/" için uzun zaman alacaktır, ancak bunu zaten biliyordunuz.

kolay yolu:

Kabul edelim, kimse bu monoton ve abes bir istatistik bilir ya da gerçekten var kaç dosya umurunda. Bu kodla programa özelliği bu serin 'dosyaları sayısını' ekleyebilirsiniz:

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

bu yöntemlerden herhangi sizin için çalışan varsa bize bildirin.

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

  0

Tam olarak önümde denediğim şey buydu ama sonuçta ortaya çıkan sayı bana mantıklı gelmiyor. Daha spesifik olmak için yukarıdaki soruyu düzenledim. 24 şub. 092009-02-24 17:09:01

  0

haha, rastgele yorumdaki mizahı seviyorum. 31 eki. 092009-10-31 01:56:43


0

Edit bakınız: Spotlight her dosyayı takip etmez, onun meta yeterli olmayacak şekilde. dizin ağacında geçiş bir seçenek ise

  0

Oldukça eminim ki spot ışık tüm cildinizde yürümez. Ben/Uygulamalar ve/Kullanıcılar (ve// Kütüphane gibi şeyler görmezden) yapışır düşünüyorum. 23 şub. 092009-02-23 01:09:29


1

(doğrudan sürücünün sorgulama daha yavaş olacaktır):

import os 

dirs = 0 
files = 0 

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