पायथन के साथ ड्राइव पर फ़ाइलों की संख्या कैसे निर्धारित करें?


5

मैं यह पता लगाने की कोशिश कर रहा हूं कि पाइथन के साथ दिए गए एचएफएस + ड्राइव पर फ़ाइलों की संख्या को तुरंत कैसे प्राप्त करें।

मैं os.statvfs के साथ खेल रहा हूं और ऐसा कुछ भी नहीं मिला (जो मेरे लिए उपयोगी लगता है)।

कोई विचार?

संपादित करें: मुझे थोड़ा और विशिष्ट होने दें। =]

मैं विभिन्न कारणों से rsync के आसपास एक टाइममैचिन-जैसी रैपर लिख रहा हूं, और ड्राइव पर फ़ाइलों की संख्या का एक बहुत तेज अनुमान (सही नहीं होना चाहिए) स्कैन करने जा रहा है। इस तरह से मैं rsync से प्रगति देख सकता हूं (यदि आप इसे rsync -ax --progress, या -P विकल्प के साथ कहते हैं) क्योंकि यह अपनी प्रारंभिक फ़ाइल सूची बनाता है, और उपयोगकर्ता को प्रतिशत और/या ईटीए की रिपोर्ट करता है।

यह वास्तविक बैकअप से पूरी तरह से अलग है, जो प्रगति पर कोई समस्या नहीं है। लेकिन ड्राइव के साथ मैं कई मिलियन फाइलों के साथ काम कर रहा हूं, इसका मतलब है कि उपयोगकर्ता कुछ मिनटों के लिए ऊपरी बाउंड के साथ फाइलों की संख्या का काउंटर देख रहा है।

मैंने os.statvfs के साथ अभी तक किसी एक उत्तर में वर्णित विधि के साथ खेलने का प्रयास किया है, लेकिन परिणाम मुझे समझ में नहीं आता है।

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

अधिक पोर्टेबल तरह से मुझे 1.1 चारों ओर मिलियन इस मशीन है, जो हर दूसरे सूचक मैं इस मशीन पर देखा है, rsync चल इसकी तैयारी सहित रूप में ही है पर देता है:

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

ध्यान दें कि पहली विधि तात्कालिक है, जबकि दूसरे ने मुझे 15 मिनट बाद अपडेट करने के लिए वापस कर दिया क्योंकि इसे चलाने में इतना लंबा लगा।

क्या कोई इस नंबर को पाने के लिए इसी तरह से जानता है, या os.statvfs संख्याओं का इलाज/व्याख्या करने के तरीके में क्या गलत है?

  0

os.statvfs [os.B_FILES] का आउटपुट आपके अपेक्षा से भिन्न होता है? (यदि आप os.statvfs से नमूना आउटपुट पेस्ट कर सकते हैं और समझा सकते हैं * क्यों * यह सहायक नहीं है, इससे उन लोगों की मदद मिलेगी जो आपकी मदद करने के लिए ओएस एक्स नहीं जानते हैं)। 22 feb. 092009-02-22 03:54:25

  0

@ चार्ल्स: मैंने अपने प्रश्न को कुछ वास्तविक विवरणों के साथ अपडेट किया है ... 24 feb. 092009-02-24 17:08:29

  0

आप पिछले rsync रन से किसी संख्या का उपयोग कर सकते हैं। यह त्वरित, पोर्टेबल है, और 10 ** 6 फाइलों और किसी भी उचित बैकअप रणनीति के लिए यह आपको 1% या बेहतर परिशुद्धता देगा। 24 feb. 092009-02-24 18:25:49

  0

@ जेएफ .: काफी सही! आपको इसे एक वास्तविक उत्तर के रूप में पोस्ट करना चाहिए ताकि मैं इसे +1 दे सकूं। 24 feb. 092009-02-24 21:17:32

2

आपने एक पिछले rsync रन से एक नंबर इस्तेमाल कर सकते हैं। यह त्वरित, पोर्टेबल है, और 10**6 फ़ाइलों और किसी भी उचित बैकअप रणनीति के लिए यह आपको 1% या बेहतर परिशुद्धता देगा।

  0

@ सेबेस्टियन: आपने इसे जॉयफॉर्कर से पहले टिप्पणी में पोस्ट किया था, इसलिए आपको मुझसे चेकमार्क मिलता है। 26 feb. 092009-02-26 18:27:55


7

आपके उद्देश्य का सही उत्तर एक बार प्रगति पट्टी के बिना जीना है, संख्या आरएसआईएनसी के साथ आया है और मान लें कि आपके पास प्रत्येक क्रमिक बैकअप के लिए पिछली बार फाइलें हैं।

मैं इस पर विश्वास नहीं किया, लेकिन यह लिनक्स पर काम करने के लिए लगता है:

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

इस फ़ाइल में ब्लॉक शून्य से मुक्त फ़ाइल ब्लॉक की कुल संख्या की गणना करता है। ऐसा लगता है कि अगर आप इसे किसी अन्य निर्देशिका में इंगित करते हैं तो भी पूरे फाइल सिस्टम के परिणाम दिखाए जाते हैं। os.statvfs केवल यूनिक्स पर लागू किया गया है।

ठीक है, मैं मानता हूं, मैंने वास्तव में तेज़ विधि पर आश्चर्यजनक होने से पहले 'धीमी, सही' रास्ता खत्म नहीं किया था। बस कुछ कमियां: मुझे संदेह है कि .f_files निर्देशिका भी गिनती है, और नतीजा शायद पूरी तरह से गलत है। यह फ़ाइलों को धीमा तरीके से गिनने के लिए काम कर सकता है, एक बार, और 'तेज' तरीके से परिणाम समायोजित कर सकता है?

पोर्टेबल तरीका:

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

os.walk फाइल सिस्टम में प्रत्येक निर्देशिका दिए गए पथ पर शुरू करने के लिए एक 3-टपल (dirpath, dirnames, फ़ाइल नाम) देता है।यह शायद "/" के लिए एक लंबा समय लगेगा, लेकिन आप पहले से ही जानते थे।

आसान तरीका:

क्यों न हम स्वीकार करते हैं, कोई नहीं जानता या परवाह करता है कि कितने फ़ाइलों वे वास्तव में है, यह एक नीरस और निरर्थक आंकड़ा है। आप इस कोड के साथ अपने कार्यक्रम के लिए सुविधा इस शांत 'फ़ाइलों की संख्या' जोड़ सकते हैं:

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

हमें बताएं कि क्या इनमें से किसी भी आप के लिए काम करता है। इसलिए इसकी मेटाडाटा पर्याप्त नहीं होगा, स्पॉटलाइट हर फ़ाइल ट्रैक नहीं करता:

भी देखें How do I prevent Python's os.walk from walking across mount points?

  0

यह वही है जो मैं पहले से कोशिश कर रहा था, लेकिन परिणामी संख्या मुझे समझ में नहीं आता है। मैंने उपरोक्त प्रश्न को और अधिक विशिष्ट बनाने के लिए संपादित किया है। 24 feb. 092009-02-24 17:09:01

  0

हाहा, मैं यादृच्छिक टिप्पणी में हास्य प्यार करता हूँ। 31 oct. 092009-10-31 01:56:43


0

संपादित करें।

  0

मुझे यकीन है कि स्पॉटलाइट आपकी पूरी मात्रा में नहीं चलता है। मुझे लगता है कि यह/अनुप्रयोगों और/उपयोगकर्ताओं (और ~/लाइब्रेरी जैसी चीज़ों को अनदेखा कर रहा है) पर चिपक जाता है। 23 feb. 092009-02-23 01:09:29


1

हैं निर्देशिका वृक्ष traversing एक विकल्प है (सीधे ड्राइव क्वेरी करने की तुलना में धीमी हो जाएगा):

import os 

dirs = 0 
files = 0 

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