2012-06-29 11 views
10

Tôi biết hệ thống tệp của mình đang lưu trữ thời gian sửa đổi tệp theo mili giây nhưng tôi không biết cách truy cập thông tin đó qua PHP. Khi tôi làm một số ls --full-time Tôi thấy điều này:Lấy danh sách tệp lớn, sắp xếp theo thời gian tệp theo * mili giây *

-rw-r--r-- 1 nobody nobody 900 2012-06-29 14:08:37.047666435 -0700 file1 
-rw-r--r-- 1 nobody nobody 900 2012-06-29 14:08:37.163667038 -0700 file2 

Tôi giả định rằng các số sau dấu chấm là mili giây.

Vì vậy, tôi nhận ra tôi chỉ có thể sử dụng ls và có nó sắp xếp theo thời gian sửa đổi, như thế này:

$filelist = `ls -t`; 

Tuy nhiên, thư mục đôi khi có một số lượng lớn các tập tin và tôi đã nhận thấy rằng ls có thể khá chậm trong những trường hợp đó.

Vì vậy, thay vào đó, tôi đã sử dụng find nhưng không có công tắc để sắp xếp kết quả theo thời gian sửa đổi. Dưới đây là một ví dụ về những gì tôi đang làm gì bây giờ:

$filelist = `find $dir -type f -printf "%[email protected] %p\n" | sort -n | awk '{print $2}'`; 

Và, tất nhiên, điều này không loại xuống mili giây để tập tin đã được tạo ra trong cùng một thứ hai đôi khi được liệt kê theo thứ tự sai.

+1

Tại sao 'sắp xếp -n' không sắp xếp thành mili giây? Dường như với tôi rằng hai dấu thời gian '1341013506.3000000000' và' 1341013506.6000000000' sẽ được sắp xếp theo số lượng không? Tôi không thể sao chép vì máy của tôi không lưu trữ thời gian tệp ms :) –

+1

@mattedgod: kiểm tra thư mục '/ sys /' của bạn; trên hệ thống của tôi, nó hỗ trợ thời gian nano giây. – sarnold

+0

@ sarnold Hmm lạ, thư mục sys chỉ bằng nano giây nhưng hầu hết các thư mục tài liệu thì không. Thú vị ... –

Trả lời

6

Chỉ một vài hệ thống tệp (như EXT4) thực sự lưu trữ những thời gian này lên tới độ chính xác nano giây. Đây không phải là thứ được đảm bảo khả dụng, trên các hệ thống tệp khác (như EXT3) bạn sẽ nhận thấy rằng phần phân số là .000000000

Bây giờ, nếu tính năng này thực sự quan trọng đối với bạn, bạn có thể viết một phần mở rộng PHP chuyên biệt. Điều này sẽ bỏ qua các cuộc gọi đến các tiện ích bên ngoài và sẽ nhanh hơn rất nhiều. Quá trình tạo tiện ích cũng được giải thích ở nhiều nơi, như here. Một cách tiếp cận hợp lý cho một phần mở rộng như vậy có thể là một triển khai hàm fstat thay thế cho thấy các trường có độ chính xác cao có sẵn trong cấu trúc stat được định nghĩa trong /usr/include/bits/stat.h ngày nay.

Như thường lệ, không có gì là miễn phí. Phần mở rộng này sẽ phải được duy trì, có thể không thể chạy nó trên môi trường lưu trữ, vv Plus, giải pháp php của bạn sẽ chỉ chạy trên các máy chủ mà phần mở rộng của bạn đã được triển khai (mặc dù nó có thể phá vỡ bằng cách quay trở lại với kỹ thuật dựa trên ls nếu phần mở rộng không được phát hiện).

+0

Tôi đã có một cảm giác sẽ không có một giải pháp đơn giản cho việc này. Cảm ơn cậu vì đã chia sẻ những suy nghĩ của mình. :-) – Jeremy