Làm thế nào để xác định số lượng tệp trên một ổ đĩa bằng Python?


5

Tôi đã cố gắng tìm ra cách lấy (nhanh) số tệp trên một ổ đĩa HFS + đã cho bằng python.

Tôi đã chơi với os.statvfs và như vậy, nhưng không thể nhận được bất cứ điều gì (mà có vẻ hữu ích cho tôi).

Bất kỳ ý tưởng nào?

Chỉnh sửa: Hãy để tôi cụ thể hơn một chút. =]

Tôi đang viết một trình bao bọc giống như timemachine quanh rsync vì nhiều lý do khác nhau và muốn ước tính rất nhanh (không cần phải hoàn hảo) số lượng tệp trên rsync của ổ đĩa sẽ quét. Bằng cách này, tôi có thể xem tiến trình từ rsync (nếu bạn gọi nó là rsync -ax --progress, hoặc với tùy chọn -P) vì nó xây dựng danh sách tệp ban đầu của nó và báo cáo tỷ lệ phần trăm và/hoặc ETA cho người dùng.

Điều này hoàn toàn tách biệt với bản sao lưu thực sự, không có vấn đề gì khi theo dõi tiến độ. Nhưng với các ổ đĩa tôi đang làm việc với vài triệu tập tin, nó có nghĩa là người dùng đang xem một số lượng các tập tin đi lên mà không có giới hạn trên trong một vài phút.

Tôi đã thử chơi với os.statvfs với chính xác phương pháp được mô tả trong một trong các câu trả lời cho đến nay, nhưng kết quả không có ý nghĩa với tôi.

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

Cách cầm tay hơn mang lại cho tôi khoảng 1,1 triệu trên máy tính này, mà cũng giống như tất cả các chỉ số khác mà tôi đã nhìn thấy trên máy tính này, bao gồm rsync chạy quá trình chuẩn bị:

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

Lưu ý rằng phương pháp đầu tiên là tức thời, trong khi phương pháp thứ hai khiến tôi trở lại 15 phút sau đó để cập nhật vì nó mất nhiều thời gian để chạy.

Có ai biết cách tương tự để lấy số này không, hoặc điều gì sai với cách tôi xử lý/giải thích số os.statvfs?

  0

Đầu ra của os.statvfs [os.B_FILES] thay đổi như thế nào từ những gì bạn mong đợi? (Nếu bạn có thể dán đầu ra mẫu từ os.statvfs và giải thích * tại sao * nó không hữu ích, điều đó sẽ giúp những người không biết OS X để giúp bạn). 22 feb. 092009-02-22 03:54:25

  0

@Charles: Tôi đã cập nhật câu hỏi của mình với một số chi tiết thực tế ngay bây giờ ... 24 feb. 092009-02-24 17:08:29

  0

Bạn có thể sử dụng một số từ chạy rsync trước đó. Nó là nhanh chóng, di động, và cho 10 ** 6 tập tin và bất kỳ chiến lược sao lưu hợp lý nó sẽ cung cấp cho bạn 1% hoặc chính xác hơn. 24 feb. 092009-02-24 18:25:49

  0

@ J.F .: Khá đúng! Bạn nên đăng bài đó dưới dạng câu trả lời thực tế để tôi có thể trả lời +1. 24 feb. 092009-02-24 21:17:32

2

Bạn có thể sử dụng một số từ một rsync chạy trước. Nó là nhanh chóng, di động, và đối với 10**6 tệp và bất kỳ chiến lược sao lưu hợp lý nào, nó sẽ cung cấp cho bạn 1% hoặc độ chính xác cao hơn.

  0

@Sebastian: Bạn đã đăng bài này trong bình luận dài trước khi joeforker làm, vì vậy bạn nhận được dấu kiểm từ tôi. 26 feb. 092009-02-26 18:27:55


7

Câu trả lời đúng cho mục đích của bạn là sống mà không có thanh tiến trình một lần, lưu trữ số rsync đã đưa ra và giả sử bạn có cùng số lượng tệp như lần cuối cho mỗi lần sao lưu liên tiếp.

Tôi không tin điều đó, nhưng điều này dường như làm việc trên Linux:

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

này tính tổng số khối tập tin trừ các khối tập tin miễn phí. Có vẻ như hiển thị kết quả cho toàn bộ hệ thống tệp ngay cả khi bạn trỏ nó vào thư mục khác. os.statvfs chỉ được thực hiện trên Unix.

OK, tôi thừa nhận, tôi đã không thực sự để cho kết thúc 'chậm, chính xác' trước khi ngạc nhiên trước phương pháp nhanh. Chỉ là một vài nhược điểm: Tôi nghi ngờ .f_files cũng sẽ đếm thư mục, và kết quả có thể hoàn toàn sai. Nó có thể làm việc để đếm các tập tin một cách chậm, một lần, và điều chỉnh kết quả từ cách 'nhanh'?

Cách di động:

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

os.walk trả về một 3-tuple (dirpath, dirnames, tên tập tin) cho mỗi thư mục trong hệ thống tập tin bắt đầu từ con đường đã chọn.Điều này có thể sẽ mất một thời gian dài cho "/", nhưng bạn đã biết điều đó rồi.

Cách dễ dàng:

Hãy đối mặt với nó, không ai biết hoặc quan tâm bao nhiêu tập tin mà họ thực sự có, đó là một số liệu thống kê buồn tẻ và vụn vặt. Bạn có thể thêm tính năng 'số lượng tệp' thú vị này vào chương trình của mình bằng mã này:

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

Hãy cho chúng tôi biết nếu bất kỳ phương pháp nào phù hợp với bạn.

Xem thêm How do I prevent Python's os.walk from walking across mount points?

  0

Đây chính xác là những gì tôi đã cố gắng trả trước, nhưng con số kết quả không có ý nghĩa với tôi. Tôi đã chỉnh sửa câu hỏi trên để cụ thể hơn. 24 feb. 092009-02-24 17:09:01

  0

haha, tôi thích sự hài hước trong nhận xét ngẫu nhiên. 31 oct. 092009-10-31 01:56:43


0

Edit: Spotlight không theo dõi tất cả các tập tin, vì vậy siêu dữ liệu của nó sẽ không đủ.

  0

Tôi chắc chắn rằng ánh đèn sân khấu không đi được toàn bộ khối lượng của bạn. Tôi nghĩ rằng nó dính vào/Applications và/Users (và bỏ qua những thứ như ~/Library). 23 feb. 092009-02-23 01:09:29


1

Nếu đi qua cây thư mục là một lựa chọn (sẽ chậm hơn so với truy vấn ổ đĩa trực tiếp):

import os 

dirs = 0 
files = 0 

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