ฉันต้องการตรวจสอบใน linux bash ว่ามีการสร้างไฟล์เกิน x ครั้งที่แล้วหรือไม่
สมมติว่าไฟล์นี้เรียกว่า text.txt และเวลาคือ 2 ชั่วโมง
if [ what? ]
then
echo "old enough"
fi
ฉันต้องการตรวจสอบใน linux bash ว่ามีการสร้างไฟล์เกิน x ครั้งที่แล้วหรือไม่
สมมติว่าไฟล์นี้เรียกว่า text.txt และเวลาคือ 2 ชั่วโมง
if [ what? ]
then
echo "old enough"
fi
คำตอบ:
สำหรับเวลาปรับเปลี่ยนเท่านั้น
if test `find "text.txt" -mmin +120`
then
echo old enough
fi
คุณสามารถใช้-cmin
สำหรับการเปลี่ยนแปลงหรือ-amin
เวลาเข้าถึง อย่างที่คนอื่นชี้ฉันไม่คิดว่าคุณจะติดตามเวลาสร้างได้
find
ส่งคืนไม่ใช่ศูนย์เมื่อไม่พบรายการที่ตรงกัน
text.txt
สันนิษฐานว่าไม่ใช่ไดเร็กทอรี
[ "$(find path/to/file -mmin +120)" ] && echo "it is old"
ฉันมักจะชอบใช้date -r /the/file +%s
เพื่อค้นหาอายุ
คุณยังสามารถทำtouch --date '2015-10-10 9:55' /tmp/file
เพื่อให้ได้เวลาที่ละเอียดมากในวัน / เวลาโดยพลการ
let AGE=$(($(date +%s)-$(date -r /path/to/file +%s)))
[ด้วยสมมติฐานที่สร้างขึ้นและไม่เคยแก้ไขหรือ "อายุสัมพันธ์กับ mod"]
function file-age { FILE_CREATED_TIME=`date -r "$1" +%s`; TIME_NOW=`date +%s`; echo "$[ ${TIME_NOW} - ${FILE_CREATED_TIME} ]"; }
$[ ]
คือถ้าไม่เลิกใช้งานอย่างน้อยก็เก่าและพกพาได้น้อยกว่าและควรใช้$(( ))
แทน และ backquotes เปราะบางกว่า$( )
; และขีดกลางในชื่อฟังก์ชันอาจไม่สามารถพกพาได้อย่างสมบูรณ์ แก่นของมันดี แต่!
การใช้stat
ที่จะคิดออกวันที่แก้ไขล่าสุดของไฟล์date
ที่จะคิดออกเวลาปัจจุบันและนิยมใช้ bashisms หนึ่งสามารถทำแบบทดสอบที่คุณต้องการขึ้นอยู่กับเวลาการปรับเปลี่ยนไฟล์สุดท้าย1
if [ "$(( $(date +"%s") - $(stat -c "%Y" $somefile) ))" -gt "7200" ]; then
echo "$somefile is older then 2 hours"
fi
แม้ว่าโค้ดจะอ่านได้น้อยกว่าfind
วิธีนี้ แต่ฉันคิดว่ามันเป็นแนวทางที่ดีกว่าจากนั้นก็วิ่งfind
ไปดูไฟล์ที่คุณ "พบ" แล้ว นอกจากนี้การจัดการวันที่เป็นเรื่องสนุก ;-)
%Z
แทน%Y
ด้านล่างเพื่อรับ "เวลาเปลี่ยน" ซึ่งอาจเป็นสิ่งที่คุณต้องการ[อัปเดต]
สำหรับผู้ใช้ mac ให้ใช้stat -f "%m" $somefile
แทนไวยากรณ์เฉพาะของ Linux ด้านบน
stat
ไม่ได้อยู่ในตัว - ฉันแย่มากฉันจะแก้ไข
ไม่ได้จัดเก็บเวลาสร้าง
สิ่งที่จัดเก็บคือการประทับเวลาสามแบบ (โดยทั่วไปสามารถปิดได้ในระบบไฟล์บางระบบหรือโดยตัวเลือกระบบไฟล์บางอย่าง):
"เปลี่ยน" ไฟล์จะนับเป็นการเปลี่ยนแปลงสิทธิ์เปลี่ยนชื่อ ฯลฯ ในขณะที่การแก้ไขเป็นเนื้อหาเท่านั้น
แม้ว่า ctime จะไม่ใช่ช่วงเวลาแห่งการสร้างในทางเทคนิคแต่ก็มักจะเป็นเช่นนั้น
เนื่องจาก ctime จะไม่ได้รับผลกระทบจากการเปลี่ยนแปลงเนื้อหาของไฟล์จึงมักจะอัปเดตเมื่อไฟล์ถูกสร้างขึ้นเท่านั้น และใช่ - ฉันได้ยินคุณทุกคนกรีดร้อง - นอกจากนี้ยังอัปเดตหากคุณเปลี่ยนสิทธิ์การเข้าถึงหรือการเป็นเจ้าของ ... แต่โดยทั่วไปแล้วจะเป็นสิ่งที่ทำครั้งเดียวโดยปกติแล้วคุณจะวางไฟล์ไว้ที่นั่นในเวลาเดียวกัน
โดยส่วนตัวแล้วฉันมักจะใช้ mtime สำหรับทุกสิ่งและฉันคิดว่านั่นคือสิ่งที่คุณต้องการ แต่อย่างไรก็ตาม ... นี่คือการปรับปรุงการทุบตีที่ "ไม่น่าสนใจ" ของ Guss ในฟังก์ชันที่ใช้งานง่าย
#! / bin / ทุบตี อายุการใช้งาน () { ชื่อไฟล์ในเครื่อง = $ 1 เปลี่ยนในเครื่อง = `stat -c% Y" $ filename "` local now = `date +% s` ท้องถิ่นผ่านไป let elapsed = now-change echo $ ผ่านไปแล้ว } ไฟล์ = "/" echo อายุของ $ file คือ $ (age "$ file") วินาที
local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime")
superuser.com/questions/427551/…
chmod
ใช้กับไฟล์อย่างง่ายจะทำให้ความคิดนั้นเป็นโมฆะ แต่ฉันสามารถอยู่กับคุณได้ ;-)
+%s
จากครึ่งหลัง
age() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); }
(ขอบคุณ @Grizly สำหรับการแก้ไข!)
noatime
ตัวเลือก (ซึ่งดีต่อประสิทธิภาพดังนั้นคุณควรใช้) ดังนั้นให้ใช้%X
แทน%Y
.
การค้นหานั้นดี แต่ฉันคิดว่าคุณสามารถใช้ anotherway ได้โดยเฉพาะอย่างยิ่งถ้าคุณต้องการตอนนี้ไฟล์เก่ากี่วินาที
date -d "now - $( stat -c "%Y" $filename ) seconds" +%s
ใช้วันที่ GNU
พิจารณาผลลัพธ์ของเครื่องมือ '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
คุณสามารถดูวันที่สามวันสำหรับการเข้าถึง / แก้ไข / เปลี่ยนแปลงได้ที่นี่ ไม่มีวันที่สร้าง คุณจะมั่นใจได้ก็ต่อเมื่อมีการแก้ไขเนื้อหาของไฟล์ (ช่อง "แก้ไข") หรือมีการเปลี่ยนแปลง inode (ช่อง "เปลี่ยน")
ตัวอย่างเมื่อทั้งสองฟิลด์ได้รับการอัปเดต:
"ปรับเปลี่ยน" จะได้รับการอัปเดตหากมีคนต่อข้อมูลเพิ่มเติมที่ส่วนท้ายของไฟล์
"เปลี่ยนแปลง" จะได้รับการอัปเดตหากมีผู้เปลี่ยนสิทธิ์ผ่าน chmod
ฉันใช้
file_age() {
local filename=$1
echo $(( $(date +%s) - $(date -r $filename +%s) ))
}
is_stale() {
local filename=$1
local max_minutes=20
[ $(file_age $filename) -gt $(( $max_minutes*60 )) ]
}
if is_stale /my/file; then
...
fi