dấu thời gian, thời gian sửa đổi và thời gian tạo tệp


105

Tôi chỉ biết điều đó ls -tls -fđưa ra các cách sắp xếp khác nhau của các tệp và thư mục con trong một thư mục.

  • Sự khác biệt giữa dấu thời gian, thời gian sửa đổi và thời gian tạo của tệp là gì?
  • Làm thế nào để có được và thay đổi các loại thông tin bằng các lệnh?
  • Về mặt thông tin nào người ta nói một tập tin "mới hơn" thông tin kia?
  • Những loại thông tin thay đổi sẽ không làm cho tập tin khác nhau?

Ví dụ, tôi thấy ai đó đã viết:

Theo mặc định, chương trình rsync chỉ để xem các tệp có kích thước và dấu thời gian khác nhau hay không. Nó không quan tâm tập tin nào mới hơn, nếu nó khác, nó sẽ bị ghi đè. Bạn có thể chuyển cờ '--update' cho rsync, điều này sẽ khiến nó bỏ qua các tệp trên đích nếu chúng mới hơn tệp trên nguồn, nhưng chỉ miễn là chúng cùng loại tệp. Điều này có nghĩa là nếu, ví dụ, tệp nguồn là một tệp thông thường và đích là một liên kết tượng trưng, ​​tệp đích sẽ bị ghi đè, bất kể dấu thời gian.

Mặt khác, loại tệp ở đây chỉ có nghĩa là tệp thông thường và simlink, không phải loại như pdf, jpg, htm, txt, v.v.?


Câu trả lời:


138

Có 3 loại "dấu thời gian":

  • Truy cập - lần cuối cùng đọc tệp
  • Sửa đổi - lần cuối cùng tệp được sửa đổi (nội dung đã được sửa đổi)
  • Thay đổi - lần cuối cùng dữ liệu meta của tệp đã được thay đổi (ví dụ: quyền)

Để hiển thị thông tin này, bạn có thể sử dụng statđó là một phần của coreutils.

stat cũng sẽ hiển thị cho bạn một số thông tin khác như thiết bị, nút, liên kết, v.v.

Hãy nhớ rằng loại thông tin này phụ thuộc nhiều vào các tùy chọn hệ thống tập tin và gắn kết. Ví dụ: nếu bạn gắn kết một phân vùng với noatimetùy chọn, sẽ không có thông tin truy cập nào được ghi.

Một tiện ích để thay đổi dấu thời gian sẽ là touch. Có một số đối số để quyết định thay đổi dấu thời gian nào (ví dụ: -a cho thời gian truy cập, -m cho thời gian sửa đổi) và ảnh hưởng đến việc phân tích cú pháp của dấu thời gian mới. Xem man touchđể biết thêm chi tiết.

touchcó thể trở nên tiện dụng khi kết hợp với cp -u( "chỉ sao chép khi tệp SOURCE mới hơn tệp đích hoặc khi tệp đích bị thiếu" ) hoặc để tạo các tệp đánh dấu trống.


1
Cảm ơn! Đối với lệnh rsync, trong "không quan tâm tệp nào mới hơn", về mặt loại dấu thời gian có nghĩa là "mới hơn". Ngoài ra, trên một lưu ý phụ, loại tệp mà rsync quan tâm chỉ có nghĩa là tệp thông thường và simlink, không phải loại như pdf, jpg, htm, txt, v.v.?
Tim

2
Nói chung, tham chiếu đến thời gian của tệp là dấu thời gian "đã sửa đổi". Ví dụ, những gì bạn nhìn thấy từ ls -l. Và loại tệp đề cập đến tệp so với symlink (hoặc các loại tệp khác như thư mục hoặc thiết bị). Không phải loại dữ liệu trong tệp là gì (văn bản so với jpeg, v.v.).
Seth L

2
@Tim Trong bối cảnh đó, đó là dấu thời gian được sửa đổi; rsync đang nói rằng khi quyết định có nên sao lưu tệp hay không, thì nó không kiểm tra xem tệp nguồn đã được sửa đổi gần đây hơn so với bản sao lưu hiện có (phổ biến với các chương trình sao lưu); nó chỉ kiểm tra xem các tệp có kích thước khác nhau hoặc thời gian sửa đổi khác nhau và sao lưu nếu vậy
Michael Mrozek

1
Và làm thế nào để tôi biết khi nào tập tin được tạo ra đầu tiên? Thông tin này được duy trì ở đâu đó hay bị mất trong các bản cập nhật? Vì vậy, để nói, các tập tin đã tồn tại bao lâu ..?
xyz

1
Các stat (2) người đàn ông trang mô tả chi tiết hơn khi những timestamps được thay đổi.
Cristian Ciupitu

35

Câu trả lời của echox là hợp lệ nhưng tôi muốn thêm thông tin về thời gian tạo tập tin.

Hỗ trợ hệ thống tập tin

Một số hệ thống tệp hỗ trợ một mục nhập bổ sung trong nút liên quan đến thời gian tạo (hoặc thời gian sinh). Tôi biết rằng ext4 hỗ trợ tính năng này và cả JFS và BTRFS .

Tuy nhiên, hầu hết các công cụ và API chưa được cập nhật để đọc thông tin bổ sung này. Vì vậy, ngay cả khi nó có thể ở đó, nó không thể truy cập được.

Ví dụ trên Ubuntu 12.04 LTS Tôi nhận được những điều sau đây cho một tệp tôi đã tạo ngày hôm nay:

$ echo Just another test > /tmp/mytest
$ sleep 3
$ touch /tmp/mytest
$ sleep 2
$ cat /tmp/mytest > /dev/null
$ stat /tmp/mytest 
[...]
Access: 2012-06-05 13:33:44.279774711 +0200
Modify: 2012-06-05 13:33:34.611893317 +0200
Change: 2012-06-05 13:33:34.611893317 +0200
 Birth: -
$ sudo debugfs -R 'stat /tmp/mytest' /dev/sda1
[...]
 ctime: 0x4fcdee8e:91e30114 -- Tue Jun  5 13:33:34 2012
 atime: 0x4fcdee98:42b417dc -- Tue Jun  5 13:33:44 2012
 mtime: 0x4fcdee8e:91e30114 -- Tue Jun  5 13:33:34 2012
crtime: 0x4fcdee46:01258f1c -- Tue Jun  5 13:32:22 2012
[...]

Bạn có thể thấy rằng hàm stat mới hơn có trường sinh, mặc dù đầu ra có vẻ không chính xác. Và thông qua gỡ lỗi, chúng tôi có thể nhận được thông tin (thời gian như tôi trên hệ thống tệp ext4).

hỗ trợ statx

Hiện tại kể từ Kernel 4.11, một cuộc gọi hệ thống statx mới , ngoài sự hỗ trợ tốt hơn của Y2038 hoặc hệ thống tệp mạng, nó cũng mang đến một vài tính năng bổ sung như btimetruy cập hoặc thời gian sinh (thời gian tạo). Hỗ trợ cho ext4 phải ở cùng bản phát hành kernel 4.11.

Đã có các bản vá để thêm hỗ trợ cho tòa nhà mới này trong các bản phát hành Kernel sau này: ví dụ BTRFS và F2FS trong Kernel 4.13, SMB3 trong 4.14, GFS2 trong 4.15, NFS trong 4.16, v.v.

Glibc sắp tới sẽ cung cấp một lệnh gọi chức năng để truy vấn giao diện này (xem tin tức Phoronix về hỗ trợ glibc statx ). Vì vậy, chúng tôi có thể mong đợi hỗ trợ cho tính năng này trong không gian người dùng khá sớm.


Bạn có biết nếu btime vẫn còn nguyên khi các tệp từ Windows (Thời gian tạo) được chuyển sang ext4 và ngược lại, như mtime không?
thiên đường

@paradroid xin lỗi tôi không biết câu trả lời. Nếu bạn có nghĩa là trong Linux khi sao chép tệp từ NTFS sang ext4, người ta sẽ cần tìm trong trình điều khiển NTFS nếu nó hỗ trợ thời gian tạo. Nếu bạn có nghĩa là trong Windows, người ta sẽ cần tìm trong trình điều khiển ext4 cho Windows.
Huygens
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.