2011-11-10 34 views
5

Tôi biết cách liệt kê tất cả các thư mục con và tệp trong cây thư mục. Nhưng tôi đang tìm cách liệt kê tất cả các tệp mới được tạo, sửa đổi và (nếu có thể) các tệp đã xóa trong tất cả các thư mục trong cây thư mục bắt đầu từ thư mục gốc.Mã Python để tìm tất cả các tệp mới được tạo, sửa đổi và xóa trong tất cả các thư mục/thư mục con bắt đầu từ/directory

+0

Vui lòng chỉ định nội dung mới được tạo cho bạn. Trong giờ trước? Ngày cuối cùng? Kể từ một năm? Nếu bạn biết cách xây dựng một cây thư mục, tại sao bạn không sử dụng 'os.lstat' để truy cập các thuộc tính của tệp? – hochl

+0

Trong giờ trước .... – nsh

+0

sau đó sử dụng trường 'st = os.lstat (filepath)' và trường 'st.st_mtime' và kiểm tra xem chênh lệch với thời gian hiện tại có nhỏ hơn 1800 hay không - đó là nó. – hochl

Trả lời

11

Bạn có thể tìm thấy tất cả các file tạo hoặc sửa đổi trong vòng nửa giờ bằng cách nhìn vào "mtime" của mỗi tập tin:

import os 
import datetime as dt 

now = dt.datetime.now() 
ago = now-dt.timedelta(minutes=30) 

for root, dirs,files in os.walk('.'): 
    for fname in files: 
     path = os.path.join(root, fname) 
     st = os.stat(path)  
     mtime = dt.datetime.fromtimestamp(st.st_mtime) 
     if mtime > ago: 
      print('%s modified %s'%(path, mtime)) 

Để tạo một danh sách các tập tin đã xóa, bạn cũng phải có danh sách các tập tin cách đây 30 phút.


Cách thay thế mạnh mẽ hơn là sử dụng hệ thống kiểm soát sửa đổi như git. Thực hiện cam kết của tất cả các tệp trong thư mục giống như tạo ảnh chụp nhanh. Sau đó, lệnh

git status -s 

sẽ liệt kê tất cả các tệp đã thay đổi kể từ lần commit cuối cùng. Thao tác này sẽ liệt kê các tệp đã bị xóa.

+0

Chạy mã ở trên, cung cấp lỗi sau: Traceback (cuộc gọi gần đây nhất cuối cùng): Tệp "tsck.py", dòng 13, trong? in ('{p} sửa đổi {m}' định dạng (p = path, m = mtime)) AttributeError: đối tượng 'str' không có thuộc tính 'format' – nsh

+0

Có quá chậm, chúng ta có thể tìm cách khác, kích hoạt hệ thống để đăng nhập các tệp mới được tạo và sau đó phân tích tệp nhật ký. hoặc cách tốt hơn là thêm trình kích hoạt cho trợ giúp nhập nhật ký mới. – pylover

+0

@nsh: 'str.format' được giới thiệu trong Python2.6. Đối với phiên bản cũ hơn, bạn có thể sử dụng định dạng chuỗi '% s'. Tôi sẽ chỉnh sửa bài đăng của mình để thể hiện ý tôi. – unutbu

0

Hãy xem "người đàn ông tìm thấy"

tạo ra một tập tin tạm thời để so sánh

dụ:

find/-type f -newerB tempFile

một số phần của người đàn ông tìm

-newerXY reference 
      Compares the timestamp of the current file with reference. The reference argument is normally the name of a file (and one 
      of its timestamps is used for the comparison) but it may also be a string describing an absolute time. X and Y are place‐ 
      holders for other letters, and these letters select which time belonging to how reference is used for the comparison. 

      a The access time of the file reference 
      B The birth time of the file reference 
      c The inode status change time of reference 
      m The modification time of the file reference 
      t reference is interpreted directly as a time 
1
from tempfile import mkstemp 
import shutil 
import os 
import datetime as dt 
import sys 


# gets the time frame we are going to look back and builds a placeholder list to passover the info from our mtime to slay 
now=dt.datetime.now() 
ago=now-dt.timedelta(minutes=480) 
passover=[] 

# the '.' is the directory we want to look in leave it to '.' if you want to search the directory the file currently resides in 
for root,dirs,files in os.walk('.'): 
    for fname in files: 
     path=os.path.join(root,fname) 
     st=os.stat(path) 
     mtime=dt.datetime.fromtimestamp(st.st_mtime) 
     if mtime>ago: 
      passover.append(path) 


def slay(file_path, pattern, subst): 
    #Create temp file 
    fh, abs_path = mkstemp() 
    with open(abs_path,'w') as new_file: 
     with open(file_path) as old_file: 
      for line in old_file: 
       new_file.write(line.replace(pattern, subst)) 
    old_file.close() 
    #Remove original file 
    os.remove(file_path) 
    #Move new file 
    try: 
     shutil.move(abs_path, file_path) 
    except WindowsError: 
     pass 

#we pass the passover list to the slay command in a for loop in order to do muiltple replaces in those files. 
for i in passover: 
    slay(i,"String1","String2") 
+0

Tôi xây dựng này để xem xét một thư mục và chọn các tập tin sửa đổi trong thời gian cuối cùng của thời gian và sau đó thay thế văn bản trong những tập tin. Kịch bản này không được đặt xung quanh và tôi đã phải mảnh nó lại với nhau từ câu trả lời ở trên vì vậy tôi figured một người nào khác có thể đi tìm kiếm nó. – Powerboy2

+0

Vui lòng chỉnh sửa câu trả lời của bạn với thông tin này. Ngoài ra, một câu trả lời hoàn chỉnh nên có một vài dòng mô tả những gì nó làm. Vui lòng đọc bài viết sau: [Làm cách nào để viết câu trả lời hay?] (Http://stackoverflow.com/help/how-to-answer) – Mariano

Các vấn đề liên quan