Hệ điều hành Linux theo dõi ba dấu thời gian cho mỗi tệp trên hệ thống của bạn. Các dấu thời gian này cho phép bạn khám phá khi nào tệp được cập nhật lần cuối. Nhưng chúng có ý nghĩa gì? Và bạn làm thế nào để tìm ra các thời gian này cho một tệp? Có khác biệt khi nói đến thư mục không?
Sự hiểu biết về atime, ctime và mtime có thể trả lời tất cả các câu hỏi này. Đây là ba dấu thời gian mà hệ thống tệp Unix theo dõi. Nếu bạn bao giờ cần tìm hiểu chi tiết về những gì đã thay đổi và khi nào, hãy đọc tiếp.
Ba dấu thời gian Unix là gì?
Mỗi tệp có ba dấu thời gian liên quan đến nó. Linux lưu trữ chúng ở định dạng thời gian Unix đo bằng giây kể từ epoch. Ba dấu thời gian thường được gọi là atime, ctime và mtime.
mtime là phổ biến nhất và thường hữu ích nhất. Nó đại diện cho modified time (thời gian sửa đổi). Đó là thời điểm nội dung tệp được ghi vào đĩa lần cuối.
Hơi khác biệt là ctime đại diện cho change time (thời gian thay đổi). Dấu thời gian này theo dõi thay đổi siêu dữ liệu như quyền sở hữu và quyền hạn. Nó bao gồm việc đổi tên tệp — ít nhất trên các hệ điều hành Linux hiện đại điển hình. Nhưng nó cũng cập nhật khi nội dung tệp thay đổi, vì vậy nó luôn cập nhật như mtime.
Dấu thời gian thứ ba là atime, lưu trữ lần cuối cùng ai đó truy cập tệp.
Dấu thời gian áp dụng cho thư mục như thế nào?
Một thư mục Linux, về cơ bản, là danh sách các tệp trong thư mục đó. Vì vậy, tạo tệp bên trong thư mục sẽ cập nhật mtime của thư mục đó. Liệt kê các tệp trong thư mục, sử dụng lệnh ls ví dụ, cập nhật thời gian truy cập của nó. Và, giống như tệp, thay đổi quyền hoặc tên thư mục cập nhật ctime của nó.
Thời gian tạo thì sao?
Có thể bạn sẽ ngạc nhiên khi biết Linux đơn giản không theo dõi thời gian tạo. Bạn có thể ban đầu nghĩ ctime đại diện cho creation time (thời gian tạo). Tương tự, bạn có thể nghĩ đó là thứ rất hữu ích để tìm ra.
Nhiều ứng dụng lưu tệp bằng cách tạo chúng từ đầu mỗi lần. Điều này sẽ khiến việc sử dụng thời gian tạo trở nên gây hiểu lầm.
Cách xem các dấu thời gian khác nhau
Cách đơn giản nhất để lấy thông tin dấu thời gian là lệnh ls. Định dạng long mặc định hiển thị chi tiết cho mtime:
$ date
Sat Mar 6 16:57:01 GMT 2021
$ echo "hello, world" > tmp
$ ls -l tmp.txt
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 16:57 tmp
Bạn có thể hiển thị atime bằng cách dùng cờ -u:
$ date
Sat Mar 6 16:59:33 GMT 2021
$ cat tmp
hello, world
$ ls -lu tmp
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 16:59 tmp
$ ls -l tmp
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 16:57 tmp
Dòng cuối xác nhận mtime của tệp này khác với atime. Cuối cùng, dùng cờ -c để xem ctime:
$ date
Sat Mar 6 17:02:34 GMT 2021
$ mv tmp tmp2
$ ls -lc tmp2
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 17:02 tmp2
$ ls -l tmp2
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 16:57 tmp2
$ ls -lu tmp2
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 16:59 tmp2
Lần này, chúng ta xác nhận cả ba thời gian đều khác nhau và chính xác: chúng ta sửa đổi, rồi truy cập, rồi thay đổi tệp, theo thứ tự đó.
Một phương án thay thế cho ls là lệnh stat. Lệnh này hiển thị chi tiết cấp thấp từ inode của tệp. Nó giúp dễ dàng kiểm tra cả ba thời điểm cùng lúc. Nó cũng giải quyết vấn đề cờ -u không trực quan. Đây là ví dụ đầu ra cho cùng tệp:
$ stat tmp2
File: `tmp2'
Size: 13 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 327688 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ ubuntu) Gid: ( 1000/ ubuntu)
Access: 2021-03-06 16:59:45.000000000 +0000
Modify: 2021-03-06 16:57:59.000000000 +0000
Change: 2021-03-06 17:02:43.000000000 +0000
Cách cập nhật dấu thời gian
Lệnh touch thay đổi thời gian sửa đổi và truy cập của tệp. Nó cũng là cách tiện lợi tạo tệp rỗng, sẽ làm nếu tệp chưa tồn tại:
touch tmp
Mặc định, nó sẽ đặt mtime và atime thành thời gian hiện tại. Bạn có thể đặt thời gian khác với cờ -t:
touch -t 202103061200 tmp
Bạn cũng có thể đặt chỉ mtime hoặc atime với cờ -m và -a tương ứng:
touch -t 202103061300 -m tmp
Lưu ý ctime luôn cập nhật khi chúng ta đặt atime hoặc mtime.
Cách tìm tệp dựa trên dấu thời gian
Lệnh find là công cụ khác tác động trên dấu thời gian. Nó có thể lọc tệp dựa trên atime, ctime hoặc mtime. Ví dụ:
find . -amin 15
sẽ tìm tệp được truy cập chính xác 15 phút trước, trong khi:
find . -mtime -2
sẽ tìm tệp được sửa đổi trong hai ngày qua.
Linux theo dõi mỗi tệp ba lần
Dấu thời gian tệp được tham chiếu phổ biến nhất là mtime. Đây là ngày và giờ mà danh sách tệp hiển thị, ví dụ. Nhưng hai dấu thời gian khác cũng có thể hữu ích, miễn là bạn hiểu chúng đề cập đến gì. Đặc biệt, luôn nhớ rằng ctime đại diện cho change time (thời gian thay đổi), không phải creation time (thời gian tạo).
Các lệnh như touch và stat là thành viên hữu ích trong hộp công cụ dòng lệnh Linux. Các lệnh này sẽ nâng cao quy trình làm việc Linux của bạn bằng cách cho phép bạn tạo tệp mới nhanh chóng.