Câu hỏi làm thế nào để kiểm tra bash cho dù một tập tin đã được tạo ra hơn x thời gian trước?


Tôi muốn kiểm tra trong linux bash cho dù một tập tin đã được tạo ra nhiều hơn x thời gian trước đây.

giả sử tệp được gọi là text.txt và thời gian là 2 giờ.

 if [ what? ]
 then
     echo "old enough"
 fi

76
2018-02-16 09:25


gốc




Các câu trả lời:


Chỉ cho thời gian sửa đổi

if test `find "text.txt" -mmin +120`
then
    echo old enough
fi

Hoặc, giống nhau trong một dòng:

#!/bin/bash
find text.txt -mmin +120 -exec echo "old enough" \;

Bạn có thể dùng -cmin để thay đổi hoặc -amin cho thời gian truy cập. Như những người khác đã chỉ tôi không nghĩ rằng bạn có thể theo dõi thời gian tạo.


103
2018-02-16 09:36



bạn có thể thả 'test' và backticks. Điều này tương tự với 'if (test == true)' vs 'if (test)' - guns
@ súng: không có bạn có thể không. - kmkaplan
Bạn hoàn toàn đúng; Tôi cho rằng tôi đã nghĩ rằng find trả về khác không khi không tìm thấy kết quả phù hợp. - guns
Bạn có thể thả backticks và làm nếu kiểm tra $ (tìm text.txt -mmin +120) - tommy.carstensen
@BroSlow nhìn tốt hơn: có Không "nhiều hơn một" có thể. Tất nhiên, text.txt được cho là không phải là một thư mục. - kmkaplan


Tôi luôn thích sử dụng date -r /the/file +%s để tìm tuổi của nó.

Bạn cũng có thể làm touch --date '2015-10-10 9:55' /tmp/file để có được thời gian cực kỳ chi tiết vào một ngày / thời gian tùy ý.


33
2018-03-08 00:46



Hôm nay tôi cũng đang tìm kiếm điều tương tự. Tốt! - Neutralizer
Cảm ơn. Tôi đã đáp xuống câu hỏi SO này vì tôi googled "cách in tuổi của tệp bash". Vì vậy, đây là chính xác những gì tôi đang tìm kiếm! - Noah Sussman
Cảm ơn! với chỉ báo trước rằng ở trên là một dấu thời gian (không phải tuổi tác) nhưng có thể được sử dụng để calc tuổi như vậy let AGE=$(($(date +%s)-$(date -r /path/to/file +%s)))  [với giả định đã tạo và không bao giờ sửa đổi hoặc "tuổi tương đối so với mod"] - nhed
function file-age { FILE_CREATED_TIME=`date -r "$1" +%s`; TIME_NOW=`date +%s`; echo "$[ ${TIME_NOW} - ${FILE_CREATED_TIME} ]"; } - turiyag


Thời gian tạo không được lưu trữ.

Những gì được lưu trữ là ba dấu thời gian (nói chung, chúng có thể được tắt trên một số hệ thống tập tin nhất định hoặc theo một số tùy chọn hệ thống tập tin nhất định):

  • Lần truy cập cuối cùng
  • Lần sửa đổi lần cuối
  • Thời gian thay đổi lần cuối

"Thay đổi" đối với tệp được tính là thay đổi quyền, đổi tên, v.v. Trong khi sửa đổi chỉ là nội dung.


16
2018-02-16 09:33





Sử dụng stat để tìm ra ngày sửa đổi cuối cùng của tệp, date để tìm ra thời gian hiện tại và việc sử dụng bashism một cách tự do, người ta có thể làm bài kiểm tra mà bạn muốn dựa trên thời gian sửa đổi cuối cùng của tập tin1.

if [ "$(( $(date +"%s") - $(stat -c "%Y" $somefile) ))" -gt "7200" ]; then
   echo "$somefile is older then 2 hours"
fi

Mặc dù mã có thể đọc được ít hơn một chút find cách tiếp cận, tôi nghĩ rằng đó là một cách tiếp cận tốt hơn sau đó chạy find để xem một tệp bạn đã "tìm thấy". Ngoài ra, thao tác ngày là thú vị ;-)


  1. Như Phil ghi nhận chính xác thời gian tạo không được ghi lại, nhưng sử dụng %Z thay vì %Y dưới đây để có được "thay đổi thời gian" mà có thể là những gì bạn muốn.

[Cập nhật]

Đối với người dùng mac, sử dụng stat -f "%m" $somefile thay vì cú pháp cụ thể của Linux ở trên


12
2017-09-09 19:18



Vỏ nào là ngày tháng và chỉ số được tích hợp? Bash của tôi (GNU, 3.2.48) không có chúng. - Ian Clelland
ối xin lỗi. stat không phải là xây dựng - rất xấu của tôi, tôi sẽ sửa chữa. - Guss
@ tommy.carstensen - Tôi không có mac. Bạn có thể mô tả những gì không hoạt động? Ngoài ra, bạn đang sử dụng bash? Tôi biết nhiều người Macists thích zsh. - Guss
@ErikJohansson Tôi không muốn yêu cầu cài đặt phần mềm bổ sung khi sử dụng phần mềm hiện có hoạt động tốt - đây không phải là Windows, bạn biết ;-) - Guss
Đối với những người muốn sử dụng điều này nhưng sửa đổi nó, nó sẽ là tốt để biết chính xác những gì nó đang làm: $ (($ (date + "% s") - giây kể từ 1970-01-01 00:00:00 UTC (Epoch) $ (stat -c "% Y" $ somefile))) - Thời gian sửa đổi lần cuối là giây kể từ Epoch -gt "7200" - kiểm tra nếu chênh lệch lớn hơn x số giây. - devo


Mặc dù ctime không kỹ thuật thời điểm sáng tạo, nó khá thường xuyên.

Vì ctime không bị ảnh hưởng bởi những thay đổi đối với nội dung của tệp, nó thường chỉ được cập nhật khi tệp được tạo. Và có - tôi có thể nghe tất cả các bạn hét lên - nó cũng được cập nhật nếu bạn thay đổi quyền truy cập hoặc quyền sở hữu ... nhưng nói chung đó là điều được thực hiện một lần, thường là cùng lúc bạn đặt tệp ở đó.

Cá nhân tôi luôn luôn sử dụng thời gian cho tất cả mọi thứ, và tôi tưởng tượng đó là những gì bạn muốn. Nhưng dù sao ... đây là một sự phục hồi của bash "không hấp dẫn" của Guss, trong một chức năng dễ sử dụng.

#! / bin / bash
function age () {
   tên tệp cục bộ = $ 1
   local changed = `stat -c% Y" $ filename "`
   giờ địa phương = `date +% s`
   địa phương đã trôi qua

   let elapsed = now-changed
   echo $ elapsed
}

tệp = "/"
echo Độ tuổi của tập tin $ là $ (tuổi "$ tập tin") giây.

11
2018-03-25 10:15



Điều này rất hữu ích, nhưng nó không hoạt động ngay lập tức đối với OSX vì stat được thực hiện khác nhau trên nó. Cách tương thích chéo hệ thống duy nhất mà tôi tìm thấy là sử dụng perl. Tập lệnh sẽ hoạt động trên máy Mac nếu bạn thay thế dòng tương ứng bằng cách này: local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime")  superuser.com/questions/427551/… - Bijou Trouvaille
"Thời gian tạo" là một khái niệm khó nắm bắt. Nó có nghĩa là gì đối với một tập tin sao chép? Điều gì cho một tệp được di chuyển? Điều gì sẽ xảy ra nếu nó được di chuyển trên một đường viền thiết bị (vì vậy nó đã được tạo ra một lần nữa, theo nghĩa nào đó)? Có nghĩa là gì đối với một tệp được đóng gói và sau đó không được đóng gói? Một số câu trả lời là có thể ở đây và không có sự đồng thuận tồn tại. Tuy nhiên, việc đề cập đến ctime là tốt đẹp, nhưng tôi sẽ không đặt nó theo ngữ nghĩa gần khái niệm mơ hồ về "thời gian tạo". Đặc biệt kể từ khi đơn giản chmod, được áp dụng trên tệp, sẽ vô hiệu hóa ý tưởng đó. Nhưng tôi có thể sống với bạn làm điều đó ;-) - Alfe
@Alfe: Bạn đang bỏ lỡ +%s từ nửa thứ hai - Grizly
Độ tuổi đó có thể ngắn hơn: age() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); }  (Cảm ơn @Grizly đã sửa!) - Alfe
Trên thực tế, tốt hơn nên sử dụng thời gian truy cập là thời gian tạo trên tất cả các hệ thống tệp được gắn kết noatime tùy chọn (đó là tốt cho hiệu suất vì vậy bạn nên sử dụng nó). Vì vậy, chỉ cần sử dụng %X thay vì %Y. - Nux


Việc tìm thấy một là tốt nhưng tôi nghĩ rằng bạn có thể sử dụng đường khác, đặc biệt là nếu bạn cần phải bây giờ bao nhiêu giây là tập tin cũ

date -d "now - $( stat -c "%Y" $filename ) seconds" +%s

sử dụng ngày GNU


5
2018-05-06 13:06



Không hoạt động trên Mac. - tommy.carstensen
sử dụng gstat, "brew install coreutils" - Erik Johansson
@ erik-johansson Tôi không có quyền quản trị. - tommy.carstensen


Xem xét kết quả của công cụ 'stat':

  File: `infolog.txt'
  Size: 694         Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 11635578    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     fdr)   Gid: ( 1000/     fdr)
Access: 2009-01-01 22:04:15.000000000 -0800
Modify: 2009-01-01 22:05:05.000000000 -0800
Change: 2009-01-01 22:05:05.000000000 -0800

Bạn có thể xem ở đây ba ngày để truy cập / sửa đổi / thay đổi. Không có ngày tạo ra. Bạn chỉ có thể chắc chắn khi nội dung tập tin là sửa đổi (trường "sửa đổi") hoặc inode của nó thay đổi ("thay đổi" cánh đồng).

Ví dụ về thời điểm cả hai trường được cập nhật:

"Sửa đổi" sẽ được cập nhật nếu ai đó nối thêm thông tin vào cuối tập tin.

"Thay đổi" sẽ được cập nhật nếu ai đó thay đổi quyền thông qua chmod.


3
2018-02-16 09:33



được cấp, stat có thể cho bạn biết thông tin liên quan. Nhưng nó sẽ khá tẻ nhạt để phân tích để có được những gì chúng ta muốn. - PypeBros