จะตรวจสอบว่า file2 ใหม่กว่า file1 ใน bash ได้อย่างไร?


51

ฉันจะตรวจสอบว่าfile2มีการแก้ไขครั้งสุดท้ายหลังจากได้file1อย่างไร

ในตัวอย่างนี้perlมีการปรับเปลี่ยนเมื่อเร็ว ๆ stackนี้มากกว่า มีคำสั่ง bash หรือ Linux ที่สามารถเปรียบเทียบไฟล์เหล่านี้ตามเวลาการแก้ไขหรือไม่?

-rw-r--r--    1 root     root         1577 Sep  7 22:55 stack
-rwxr-xr-x    1 root     root          626 Sep  7 23:10 perl

คำตอบ:


51

พบได้ที่นี่

for f in /abcd/xyz* do
   [ "$f" -nt /abcd/test.txt ] && echo "file f$ found" done

14
ยัง-otเป็น "เก่ากว่า"
Dennis Williamson

1
ฉันคิดว่าฉันเพิ่งพบปัญหานี้ สำหรับไฟล์ที่มีเวลาการแก้ไขเท่ากันลงไปเป็นวินาทีพวกเขาจะอายุเท่ากันโดยการทดสอบเหล่านี้ ทั้ง -nt และ -ot ให้ผลลัพธ์เดียวกัน (false) ในกรณีที่ฉันใช้ฉันมีโปรแกรมหนึ่งอ่านเอาท์พุทอื่น ๆ และฉันต้องให้แน่ใจว่าพวกเขาได้ทำงานในลำดับที่ถูกต้อง ในกรณีนี้ดูเหมือนว่าจำเป็นต้องเปรียบเทียบนาโนวินาที
sjmc


7

อีกวิธีในการทำสิ่งนี้:

find -name file2 -newer file1

จะคืนค่าว่างหาก file2 เก่ากว่าหรืออายุเท่ากับ file1 มันจะส่งคืนชื่อ (และไดเรกทอรี) ของ file2 หากใหม่กว่า

ระวังว่า Linux จะไม่ติดตามว่าไฟล์ถูกสร้างขึ้นเมื่อใด การทดสอบเหล่านี้จะเป็นวันและเวลาที่แก้ไขล่าสุด


2
Linux ติดตามเวลาการสร้าง: มันถูกเรียกว่า ctime นอกจากนี้ยังติดตามเวลาเข้าถึงล่าสุด: atime เพียงแค่ใช้ mtime โดยทั่วไปเนื่องจากนี่เป็นเวลาแก้ไขครั้งล่าสุดซึ่งมีประโยชน์มากที่สุด
Coroos

2
@Coroos: ctimeไม่ใช่เวลาสร้าง มันเป็นเวลาเปลี่ยน inode และได้รับการอัพเดทเมื่อคุณสมบัติของไฟล์เช่นเจ้าของหรือการอนุญาตหรือการเปลี่ยนแปลงหรือเมื่อคุณปรับเปลี่ยนไฟล์ ระบบไฟล์บางระบบสนับสนุนเวลาเกิด แต่เคอร์เนลไม่มี สถิติแสดงเวลาเกิดที่ว่างเปล่า ดูunix.stackexchange.com/a/91200โปรดทราบว่า OS X รองรับเวลาเกิดstat -f %SB filename
Dennis Williamson

ดู htrp: //unix.stackexchange.com/a/50184 เกี่ยวกับวิธีใช้debugfsเพื่อดูเวลาการสร้าง (เกิด) ใน Linux
Dennis Williamson

2

หากคุณต้องการข้อมูลรายละเอียดเพิ่มเติมคุณสามารถใช้statคำสั่ง

<tbielawa>@(fridge)[~/SuperUser] 03:15:10
$ touch firstFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:24
$ touch secondFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:45
$ stat firstFile 
  File: `firstFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151528      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:24.938721003 -0400
Modify: 2010-09-14 03:15:24.938721003 -0400
Change: 2010-09-14 03:15:24.938721003 -0400
<tbielawa>@(fridge)[~/SuperUser] 03:15:48
$ stat secondFile 
  File: `secondFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151529      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:45.074722792 -0400
Modify: 2010-09-14 03:15:45.074722792 -0400
Change: 2010-09-14 03:15:45.074722792 -0400

2
echo $(($(date -r file1 +%s)-$(date -r file2 +%s)))
2208

หากผลลัพธ์คือ> 0 ไฟล์แรกจะใหม่กว่า (ใหม่กว่าในแง่ของการแก้ไขครั้งล่าสุด - ไม่ใช่เวลาสร้างซึ่งถูกเก็บไว้บน linux)


-nt โดยทั่วไปดีขึ้น แต่ก็ยังคงเป็นประโยชน์ post ...
BuvinJ

0

ตามลิงค์นี้ยูนิกซ์จะไม่เก็บวันที่สร้าง http://www.issociate.de/board/post/302628/How_to_check_file_creation_date.html

แต่จะเก็บการเข้าถึงล่าสุด

สำหรับการเข้าถึงล่าสุด

 ls -t  # displays in order of date. So the first one is the 

ls แสดงแต่ละไฟล์บนบรรทัดใหม่

ls -t แสดงไฟล์ล่าสุดในบรรทัดแรกและอื่น ๆ

  • คุณสามารถใช้ตัวเองเพื่อเลือกบรรทัดแรก
  • คุณสามารถใช้ sed เพื่อเลือกบรรทัดแรก

    ls -t php.exe php.ini | sed -n '1p' php.ini

สามารถทำได้-lt แม้ว่าคุณจะเห็นว่าหากคุณไม่ได้ระบุไฟล์ใด ๆ .. และมันเป็นไดเรกทอรี .. แล้วมันจะให้ผลรวมในบรรทัดแรกดังนั้นคุณเลือกบรรทัดที่สองเช่น$ls -lt | sed -n '2p'

สิ่งที่ดีก็คือ

ls -t | head -n 1

หรือ

ls -lt | head   

แสดง 10 บรรทัดแรกตามลำดับไฟล์แรกที่แก้ไขก่อนและคุณสามารถดูได้ว่ามันคืออะไร


-tคือเวลาแก้ไข -uเป็นเวลาเข้าถึง
Dennis Williamson

ขอบคุณ .. ฉันสงสัยเกี่ยวกับ -u .. ความแตกต่าง .. และใช่ตามที่คุณแนะนำ .. -t และ -u สั่งตามเวลา .. ตามที่มนุษย์มี ดีกว่าบอกว่าสั่งตามวันที่
barlop

แม้ว่าอาจจะไม่ดีเท่าคำสั่งที่เรียงตามวันที่ / เวลา ;-)
barlop

0

นี่เป็นสคริปต์เล็กน้อยฉัน:

mtf0=`stat -c %Y file0`    
mtf1=`stat -c %Y file1`    
dt=$(( mtf1 - mtf0 ))    
[[ $dt -gt 0 ]] && echo "File F1 is newer than file F0 "

คุณควรอธิบายรายละเอียดเพิ่มเติมว่าสิ่งนี้กำลังทำอะไรอยู่กับการอ้างอิงบางส่วนสำหรับคำสั่งเพื่อให้คนที่อาจใช้มันมีโอกาสอ่านเกี่ยวกับมันหรือได้ยินว่าคุณทำลายมันลงมากกว่าที่จะพิสูจน์คำสั่งและไวยากรณ์
Pimp Juice IT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.