2013-07-26 28 views
8

Đây có vẻ là trường hợp điển hình của các tính năng không chuẩn trên các nền tảng khác nhau.Cách tốt nhất để nhận thời gian sửa đổi tệp trong vài giây

Rất đơn giản, tôi muốn một phương pháp phổ biến (hoặc ít nhất là rộng rãi) được hỗ trợ để nhận được thời gian sửa đổi của một tệp dưới dạng dấu thời gian unix trong vài giây.

Bây giờ tôi biết nhiều cách khác nhau để thực hiện việc này với stat nhưng hầu hết là nền tảng cụ thể; ví dụ: stat -c %Y $file hoạt động đối với một số, nhưng sẽ không hoạt động trên OS X (và có lẽ là các hệ thống FreeBSD khác) sử dụng stat -f %m $file thay thế.

Tương tự như vậy, một số nền tảng hỗ trợ date -r $file +%s, tuy nhiên OS X/FreeBSD lại không như tùy chọn -r dường như chỉ là một thay thế để sử dụng +%s để có được một dấu thời gian unix, chứ không phải là lựa chọn tập tin tài liệu tham khảo như trên các nền tảng khác.

Cách thay thế khác mà tôi quen thuộc là sử dụng find với tùy chọn -printf, nhưng lại không được hỗ trợ rộng rãi. Phương pháp cuối cùng tôi biết là phân tích cú pháp ls, ngoài việc là một điều khó chịu phải làm, không phải là điều mà tôi tin rằng có thể (hoặc ít nhất là) nên dựa vào một trong hai.

Vì vậy, có phương pháp tương thích hơn để nhận thời gian sửa đổi của tệp không? Hiện tại tôi chỉ đang ném các biến thể khác nhau của stat vào một tập lệnh và chạy chúng cho đến khi thoát ra với trạng thái bằng 0, nhưng điều này là xa lý tưởng, ngay cả khi tôi lưu bộ nhớ cache thành công để chạy đầu tiên trong tương lai.

Trả lời

6

Vì có vẻ như không có giải pháp "đúng".

if stat -c %Y . >/dev/null 2>&1; then 
    get_modified_time() { stat -c %Y "$1" 2>/dev/null; } 
elif stat -f %m . >/dev/null 2>&1; then 
    get_modified_time() { stat -f %m "$1" 2>/dev/null; } 
elif date -r . +%s >/dev/null 2>&1; then 
    get_modified_time() { stat -r "$1" +%s 2>/dev/null; } 
else 
    echo 'get_modified_time() is unsupported' >&2 
    get_modified_time() { printf '%s' 0; } 
fi 

[sửa] tôi đang cập nhật này để phản ánh các chi tiết lên đến phiên bản cập nhật của mã tôi sử dụng, về cơ bản nó kiểm tra hai stat phương pháp chính và một date phương pháp hơi phổ biến ở bất kỳ nỗ lực để có được những sửa đổi thời gian cho thư mục làm việc hiện tại, và nếu một trong những phương thức thành công nó tạo ra một hàm đóng gói nó để sử dụng sau này trong kịch bản lệnh.

Phương pháp này khác với phương pháp trước mà tôi đăng vì nó luôn xử lý, ngay cả khi get_modified_time không bao giờ được gọi, nhưng tổng thể hiệu quả hơn nếu bạn cần phải gọi nó hầu hết thời gian. Nó cũng cho phép bạn nắm bắt một nền tảng không được hỗ trợ trước đó.

Nếu bạn thích các chức năng mà chỉ kiểm tra các chức năng khi nó được gọi, thì đây là những hình thức khác:

get_modified_time() { 
    modified_time=$(stat -c %Y "$1" 2> /dev/null) 
    if [ "$?" -ne 0 ]; then 
     modified_time=$(stat -f %m "$1" 2> /dev/null) 
     if [ "$?" -ne 0 ]; then 
      modified_time=$(date -r "$1" +%s 2> /dev/null) 
      [ "$?" -ne 0 ] && modified_time=0 
     fi 
    fi 
    echo "$modified_time" 
} 
0

Chỉ cần hỏi hệ điều hành tên của nó và đi từ đó. Ngoài ra, viết một chương trình C, hoặc sử dụng Python hoặc một chương trình khác khá phổ biến và được tiêu chuẩn hóa hơn: How to get file creation & modification date/times in Python?

+0

tôi có thể không thực sự bó bất cứ điều gì; mục đích là chỉ cần có một kịch bản shell đơn giản nên chạy trên gần như bất kỳ hệ điều hành Unix nào. Vấn đề là tôi cần phải bao gồm các môi trường như hộp NAS, có thể không bao gồm Python hoặc Perl. Có thực sự không có cách nào tốt hơn để làm điều này trong một vỏ? – Haravikk

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