แสดงรายการไฟล์ที่เปลี่ยนแปลงล่าสุดทั้งหมด (เรียกซ้ำ)


21

ดังนั้นฉันต้องการแสดงlsไฟล์ทั้งหมด(ผ่านตัวอย่าง) ซึ่งมีการเปลี่ยนแปลงในเจ็ดวันที่ผ่านมา ถ้าฉันอยู่ในโฟลเดอร์ docroot ของฉันมันควรจะดู "ลึกกว่า"

ตัวอย่างเช่น:

File        Last changed
docroot
|- myfile1  30.11.2015
|- myfile2  10.11.2015
|- MySub
   |-sub1   30.11.2015
   |-sub2   10.11.2015

ดังนั้นls(หรือเหมาะกับอะไรก็ตาม) ควรเอาท์พุทmyfile1และ MySub/sub1(ถ้าเป็นไปได้)

สิ่งนี้ทำได้ด้วยคำสั่งเดียวหรือไม่?

คำตอบ:


39

แน่นอน. จากไดเรกทอรีที่คุณทำ:

find . -type f -mtime -7 -exec ls -l {} \; 

เพิ่มการเปลี่ยนเส้นทางไปยัง ( > results.txtเพื่อเก็บไว้ในไฟล์นั้น)

  • type f ทำเฉพาะไฟล์และไม่ใช่ไดเรกทอรี
  • mtime -7 ทำเมื่อ 7 วันก่อนถึงตอนนี้ (+7 จะเป็น 'เก่ากว่า 7 วัน')
  • และจากนั้นฟีดมันlsเพื่อแสดงรายการยาว

คุณสามารถเล่นls -lส่วนนี้ด้วย:

find . -type f -mtime -7 -exec ls -Rl --time-style=long-iso {} \; 
find . -type f -mtime -7 -exec ls -R  --time-style=long-iso {} \; 

จะแสดง tree like method ที่มีไดเรกทอรีอยู่ระหว่างไฟล์ในรายการแบบยาว (1) หรือรายการแบบสั้น (2)


4
findมีlsตัวเลือกดังนั้นคุณสามารถทำได้find . -type f -mtime -7 -ls
heemayl

แน่นอน แต่สิ่งนี้ทำให้เป็นเรื่องทั่วไปมากกว่าเล็กน้อย (ฉันใช้วิธีนี้เพื่อค้นหาไฟล์ที่ฉันต้องการ - ลบ - และสามารถเปลี่ยนคำสั่งนั้นให้ทำ :))
Rinzwind

3
นอกจากนี้ยังเหมาะสมที่จะใช้find ... -exec ls -l {} +ซึ่งดำเนินการls -lอย่างมีประสิทธิภาพมากขึ้น - เวลาน้อยลงด้วยพารามิเตอร์หลายตัว นี่เป็นตัวเลือกมาตรฐานที่findระบุโดย POSIX
58

5

ด้วยzsh:

ls -l **/*(.m-7)
  • **/* จะค้นหาไฟล์ซ้ำเริ่มจากไดเรกทอรีปัจจุบัน

  • (.m-7)เป็นตัว.ระบุแบบหมุนโดยที่ระบุว่าไฟล์ปกติm-7หมายถึงไฟล์ที่ถูกแก้ไขภายใน 7 วันที่ผ่านมา


2

คำสั่งต่อไปนี้ใช้งานได้บน Mac OSX - อาจจะเป็นใน Ubuntu ...

find . -type f -mtime -7 -exec stat -lt "%Y-%m-%d %H:%M:%S" {} \; | cut -d\  -f6- | sort -r

สิ่งนี้จะค้นหาไฟล์ในแผนผังไดเรกทอรีปัจจุบันซึ่งได้รับการแก้ไขในช่วง 7 วันที่ผ่านมาให้ผลลัพธ์วันที่แก้ไข + เวลาและเส้นทางเรียงลำดับใหม่ล่าสุดก่อน

ตัวอย่างผลลัพธ์:

2018-02-21 22:06:30 ./fmxmlsnippet.xml
2018-02-19 12:56:01 ./diff.html
2018-02-19 12:44:37 ./temp/iDDR/XMSC_fmxmlsnippet.xml
2018-02-18 22:04:05 ./temp/iDDR/XMFD_fmxmlsnippet.xml
2018-02-15 10:18:27 ./xml/iDDR/XML2_fmxmlsnippet.xml
2018-02-15 10:13:29 ./xsl/fmxmlsnippet/XML2_fmCM_AnalyseLayout.xsl
2018-02-15 10:11:36 ./xsl/.DS_Store
2018-02-15 10:10:51 ./xsl/_inc/inc.XML2_fmCM_ReportReferencesToExternalFiles.xsl
2018-02-15 10:10:09 ./xsl/_inc/.DS_Store
2018-02-15 10:07:35 ./xsl/fmxmlsnippet/XML2_fmCM_AnalyseLayout-NoAnchors.xsl
2018-02-15 10:07:35 ./xsl/_inc/inc.XML2_fmCM_AnalyseLayout.xsl

ฉันจะขอบคุณข้อเสนอแนะใด ๆ จากผู้ใช้อูบุนตู


ทางออกเดียวที่ทำงานได้ดีสำหรับฉันบน Mac ขอบคุณ!
artnikpro

ยินดีต้อนรับ @artnikpro!
MrWatson

1

ไม่ใช่สิ่งที่ถูกขอ ... แต่จำได้ง่ายกว่า ...

ls -alRt docroot

หรือ

ls -alRt /path/to/top/level/directory

0

7 วันนั่นคือ 60 วินาที * 60 นาที * 24 ชั่วโมง * 7 วัน = 604800 วินาที

ค้นหาวันที่ปัจจุบันในไม่กี่วินาที (เวลา Unix ยุค):

$ date +%s
1448876323

ลบ 7 วันในไม่กี่วินาที:

expr $(date +%s) - 604800
1448271548

ตอนนี้ใช้statคำสั่งและสถิติการพิมพ์สำหรับไฟล์ทั้งหมดในรูปแบบ "ชื่อ + เวลาในไม่กี่วินาที" และใช้awkเพื่อครอบตัดไฟล์เหล่านั้นซึ่งมีเวลาแก้ไขมากกว่าวันที่เราคำนวณ

$ stat --printf="%n %Y\n" $HOME/* | awk '$2 > 1448271265 {print $0}'
/home/xieerqi/1448428697574.png 1448429613
/home/xieerqi/1448763343273.png 1448763478
/home/xieerqi/1510DRIVE 1448352453
/home/xieerqi/addRemoveDistribution 1448666843
/home/xieerqi/add-update.awk 1448716356
/home/xieerqi/add-update.sh 1448625092

โดยเฉพาะอย่างยิ่งที่น่าสนใจคือไฟล์ 3 ไฟล์ล่าสุดเพราะฉันรู้ว่าฉันทำงานกับไฟล์เหล่านั้นน้อยกว่า 7 วันที่ผ่านมา ดังนั้นฉันรู้ว่ามันใช้งานได้


2
โปรดทราบว่าแทนที่จะawk '$2 > 1448271265 {print $0}'พูดอย่างรุนแรงคุณสามารถพูดawk '$2 > 1448271265'ได้ บนเงื่อนไขที่แท้จริง awk พิมพ์บรรทัดปัจจุบันเป็นการดำเนินการเริ่มต้น
fedorqui
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.