Làm thế nào để hiển thị thời gian sửa đổi của một tập tin?


35

Tôi muốn một phương pháp để tìm và in thời gian sửa đổi của tệp, để sử dụng trong tập lệnh bash.

Tôi đã nghĩ ra:

ls -l $filename | cut -d ' ' -f '6-8'

Đầu ra nào:

Jul 26 15:05

Mặc dù tôi muốn tránh phân tích cú pháp ls, nhưng cũng rất hữu ích khi có một năm ở đó.

Lý tưởng nhất là tôi muốn thấy một đầu ra tương tự như đầu ra mặc định của datelệnh.

Tue Jul 26 15:20:59 BST 2016

Những phương pháp hữu ích khác có sẵn?

Câu trả lời:


46

Đừng sử dụng ls, đây là một công việc cho stat:

stat -c '%y' filename

-ccho phép chúng tôi nhận được đầu ra cụ thể, ở đây %ysẽ cho chúng tôi thời gian sửa đổi cuối cùng của tệp ở định dạng có thể đọc được. Để có được thời gian tính bằng giây kể từ khi sử dụng Epoch %Y:

stat -c '%Y' filename

Nếu bạn cũng muốn tên tệp, sử dụng %n:

stat -c '%y : %n' filename
stat -c '%Y : %n' filename

Đặt các chỉ định định dạng cho phù hợp với nhu cầu của bạn. Kiểm tra man stat.

Thí dụ:

% stat -c '%y' foobar.txt
2016-07-26 12:15:16.897284828 +0600

% stat -c '%Y' foobar.txt
1469513716

% stat -c '%y : %n' foobar.txt
2016-07-26 12:15:16.897284828 +0600 : foobar.txt    

% stat -c '%Y : %n' foobar.txt
1469513716 : foobar.txt

Nếu bạn muốn đầu ra như thế nào Tue Jul 26 15:20:59 BST 2016, hãy sử dụng thời gian Epoch làm đầu vào date:

% date -d "@$(stat -c '%Y' a.out)" '+%a %b %d %T %Z %Y'
Tue Jul 26 12:15:21 BDT 2016

% date -d "@$(stat -c '%Y' a.out)" '+%c'               
Tue 26 Jul 2016 12:15:21 PM BDT

% date -d "@$(stat -c '%Y' a.out)"
Tue Jul 26 12:15:21 BDT 2016

Kiểm tra dateđịnh dạng định dạng để đáp ứng nhu cầu của bạn. Thấy man datequá.


5
Hơn nữa với câu trả lời này, hãy nhớ rằng lsđược triển khai không nhất quán trên các hệ thống, và vì vậy không bao giờ nên được sử dụng cho bất kỳ loại tự động hóa nào. Thay vào đó, sử dụng các lệnh như statfindkhi viết script.
Paddy Landau

1
Xuất sắc. Tôi đã không biết về kho báu nhỏ này. Vì vậy, nhiều trong số chúng trong môi trường * nix / linux chưa được khám phá.
Ken Ingram

1

Tôi đã thử

ls -l $filename | cut -d ' ' -f '6-8'

nhưng nếu ngày nhỏ hơn 10 thì sẽ bỏ lỡ thời gian. Điều này là do không gian thêm trước ngày nếu dưới 10. Hãy thử điều này:

filename="test.txt"
ls -l $filename | awk -F ' ' '{print $6" "$7" "$8}'

Lệnh awk in các trường được phân tách bằng tất cả các khoảng trắng (-F ''). Hy vọng nó hoạt động. Tôi biết điều này không trả lời câu hỏi ban đầu mà chỉ là một sự làm rõ về lệnh ls cho ngày và giờ. Khi bạn Google "ubfox nhận được ngày và thời gian của tệp", nó sẽ liệt kê câu hỏi này ở đầu, đây là điều tôi đang tìm kiếm, vì tôi cũng không cần năm đó. Đối với năm, ngày và giờ, bạn có thể thử một trong các lệnh bên dưới. % m in số tháng. % b in chữ viết tắt tháng: Bỏ% H:% M nếu bạn không cần giờ và phút. % -d không in số 0 hàng đầu trong ngày.

date -r $filename +"%Y %m %-d %H:%M"
date -r $filename +"%y %m %-d %H:%M"
date -r $filename +"%Y %b %-d %H:%M"
date -r $filename +"%y %b %-d %H:%M"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.