lấy tuổi của tập tin đã cho


12

Làm cách nào tôi có thể nhận được tuổi của một tệp nhất định trong ít nhất là vài ngày?

Tôi nhận thức rõ ls -lhvà các lệnh tương tự. Tôi muốn một cái gì đó sẽ làm việc như thế này:

getfage <FILE> # prints out '12d' (12 days)

Ngoài ra, điều này cần phải có một chút nền tảng vì tôi cũng muốn sử dụng nó trong Mac OS X, nhưng trường hợp sử dụng chính là trên hộp Linux của tôi.

GHI CHÚ

Vì Linux không theo dõi thời gian tạo, tôi đang tìm giải pháp hai lần: một cho mtime (linux) - đó là lần cuối cùng tệp được sửa đổi - và một cho Mac OS X, có thể xử lý mtime hoặc thời gian sáng tạo.



@slm Đó là cụ thể về thời gian tạo, nó không đi vào tính toán tuổi trên dòng lệnh.
Gilles 'SO- ngừng trở nên xấu xa'


@terdon, không hẳn vậy. Xem LƯU Ý của tôi ở trên.
Alexej Magura

@AlexejMagura và làm thế nào để câu trả lời trong bản dupe không làm cho bạn? statcung cấp cho bạn tất cả những gì bạn cần phải không?
terdon

Câu trả lời:


16

Unix không theo dõi ngày tạo. Thông tin duy nhất có sẵn thường là lần cuối cùng của các tệp là:

  1. Đã truy cập
  2. Sửa đổi
  3. Thay đổi
  • 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)

( Từ câu trả lời này )

Bạn có thể nhận được ngày liên quan đến một tập tin cụ thể bằng cách sử dụng statlệnh.

Thí dụ

$ stat ffmpeg 
  File: `ffmpeg'
  Size: 19579304    Blocks: 38248      IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 10356770    Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (  500/    saml)   Gid: (  501/    saml)
Access: 2013-11-26 10:49:09.908261694 -0500
Modify: 2013-11-02 17:05:13.357573854 -0400
Change: 2013-11-02 17:05:13.357573854 -0400

OSX và HFS

Nếu bạn đang sử dụng OSX, hệ thống tệp được sử dụng trong Unix đó là HFS . Đây là một trong số ít (mà tôi biết) giữ ngày tạo trong hệ thống tệp, cùng với thời gian sửa đổi, vv tương tự như các Unix khác.

đoạn trích

Bản ghi tệp lưu trữ nhiều loại siêu dữ liệu về tệp bao gồm CNID của nó, kích thước của tệp, ba dấu thời gian (khi tệp được tạo, sửa đổi lần cuối, sao lưu lần cuối), tệp đầu tiên mở rộng dữ liệu và con trỏ tài nguyên và con trỏ đến các bản ghi phạm vi tài nguyên và dữ liệu đầu tiên của tệp trong Tệp tràn tràn. Bản ghi tệp cũng lưu trữ hai trường 16 byte được Finder sử dụng để lưu trữ các thuộc tính về tệp bao gồm những thứ như mã người tạo, mã loại, cửa sổ tệp sẽ xuất hiện và vị trí của nó trong cửa sổ.

Dấu thời gian

Dấu thời gian luôn được duy trì trong hệ thống tệp, do đó bạn bị giới hạn bởi bất kỳ theo dõi thời gian nào được cung cấp thông qua chúng (EXT3, EXT4, XFS, v.v.).

Hệ thống tập tin

Nếu bạn từng tò mò hãy xem chủ đề Wikipedia này có tiêu đề: So sánh các hệ thống tệp . Nó có danh sách các tệp tin rộng lớn nhất mà tôi biết cùng với một bảng đẹp về các tính năng khác nhau và trạng thái của nó có được hỗ trợ hay không trong một hệ thống tệp nhất định.

Người giới thiệu


Cảm ơn đã cập nhật, điều đó giúp. Trên thực tế, tôi đọc ở đây rằng ext4 có thể giữ ngày tạo nhưng điều này chưa được thực hiện trong kernel.
terdon

@terdon - yeah có ý nghĩa rằng một số hệ thống tập tin sẽ hỗ trợ nó. Nó dường như quá hạn đối với tôi, trong quá khứ, tôi hiểu tại sao nó bị bỏ đi, nhưng mọi thứ đã tiến bộ rất nhiều kể từ khi bắt đầu không có ý nghĩa gì khi không có điều này rõ ràng. Ngoài ra, bạn có thể vô hiệu hóa hỗ trợ về thời gian truy cập để có thể triển khai tương tự và sau đó bị vô hiệu hóa nếu bạn thực sự không muốn nó.
slm

18

OSX theo dõi việc tạo tệp, nhưng hầu hết các thông báo khác thì không, vì vậy không có cách nào để biết thời gian trôi qua kể từ khi tạo tệp. Bạn có thể có được thời gian trôi qua kể từ lần sửa đổi cuối cùng trên bất kỳ hệ điều hành nào.

Không có tiện ích shell di động để lấy thời gian sửa đổi của tệp, ngoại trừ lscó đầu ra không thể phân tích cú pháp. Trong Linux, lệnh sau sẽ in tuổi của tệp:

echo $(($(date +%s) - $(date +%s -r "$filename"))) seconds
echo $((($(date +%s) - $(date +%s -r "$filename")) / 86400)) days

Trong Linux, bạn có thể sử dụng stat -c %Y -- "$filename"như một từ đồng nghĩa của date +%s -r "$filename".

OSX datestatcác lệnh là khác nhau. Bạn có thể sử dụng lệnh sau:

echo $(($(date +%s) - $(stat -t %s -f %m -- "$filename"))) seconds

Các hệ thống Linux và OSX không nhúng được cài đặt Perl theo mặc định.

perl -l -e 'print -M $ARGV[0], " days"' "$filename"

Điều này phụ thuộc vào hệ điều hành hoặc hệ thống tập tin? Đây Q & A dường như ngụ ý rằng các hệ thống tập tin giữ chúng nhưng hạt nhân cần phải cung cấp một phương pháp để truy cập chúng.
terdon

@terdon - xem cập nhật của tôi.
slm

@terdon Cả hai. Câu hỏi và liên kết mà bạn liên kết là chính xác, các hệ thống tập tin hiện tại đã theo dõi thời gian tạo trong một thời gian. Trong FreeBSD, bạn thực sự có thể nhận được điều này từ stat, trong Linux, tòa nhà chọc trời chưa được làm lại nên bạn phải dùng đến hack debugfs.
wingbedubmariner 27/11/13

1
@wingedsubmariner Với lời cảnh báo rằng thời gian tạo trong hệ thống tệp thường không phải là ngày tạo trong ứng dụng, vì nhiều ứng dụng sử dụng tạo-mới-sau đó di chuyển làm phương thức để lưu phiên bản mới thay vì ghi đè tại chỗ.
Gilles 'SO- ngừng trở nên xấu xa'

4

Dựa trên câu trả lời của Gilles, đây là hàm bash trả về tuổi của tệp tính bằng giây hoặc lỗi.

function fileAge
{
    local fileMod
    if fileMod=$(stat -c %Y -- "$1")
    then
        echo $(( $(date +%s) - $fileMod ))
    else
        return $?
    fi
}

1
Chức năng gọn gàng, dễ dàng thích ứng bằng cách thêm phân chia đơn giản để xem tuổi trong Giờ, Ngày, tuần ....
Emmanuel Devaux

0

Bạn có thể sử dụng stat -f%B, ls -lUhoặc mdls -n kMDItemFSCreationDateđể xem thời gian sáng tạo (sinh) trong OS X:

$ stat -f%B file
1402340803
$ ls -lU file
-rw-r--r--  1 admin  staff  108514 Jun  9 22:06 file
$ mdls -n kMDItemFSCreationDate file
kMDItemFSCreationDate = 2014-06-09 19:06:43 +0000
$ echo $((($(date +%s)-$(stat -f%B file))/86400))
10

0
stat -c %Y <filename>

nhìn vào man statcác -ctùy chọn (định dạng)

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.