คำสั่ง Linux เพื่อค้นหาไฟล์ที่เปลี่ยนแปลงในไม่กี่วินาทีที่ผ่านมา


19

ฉันต้องการคำสั่ง Linux เพื่อค้นหาไฟล์ที่เปลี่ยนแปลงในไม่nกี่วินาทีที่ผ่านมา

มีเชลล์สคริปต์หรือเครื่องมืออื่น ๆ ที่ฉันสามารถเรียกใช้จากอินเตอร์เฟสบรรทัดคำสั่งหรือ GUI ได้หรือไม่?

คำตอบ:


14

ใช้คำสั่ง find แบบนี้:

find . -name "*.txt" -mtime -60s

เพื่อค้นหา*.txtไฟล์ทั้งหมดที่แก้ไขใน 60 วินาทีที่ผ่านมา


17
ในลินุกซ์ที่ใช้ค้นหา (จาก GNU findutils 4.4.2) find: missing argument to `-mtime'ผมได้รับข้อผิดพลาดกับคำสั่งนี้: อย่างไรก็ตามฉันสามารถรับพฤติกรรมที่ต้องการโดยใช้ -mmin และอาร์กิวเมนต์ทศนิยม ฉันไม่พบข้อมูลอ้างอิงใด ๆ ใน manpage เพื่อหาเพื่อใช้sเป็นอาร์กิวเมนต์
dr jimbob

4
-60s -mtimeไม่ได้เป็นข้อโต้แย้งที่ถูกต้อง ไม่เป็น "60s" แม้แต่ตัวเลือกที่ถูกต้องใน POSIX หรือ GNU find อาร์กิวเมนต์-mtimeเป็นหมายเลขที่ระบุจำนวนรอบระยะเวลา 24 ชั่วโมงที่ผ่านมาเมื่อแก้ไขไฟล์
dannysauer

13

วิธีการแก้ปัญหาที่มีการระบุ mtime วินาทีไม่ทำงานบนระบบลินุกซ์ของฉันที่ใช้==find --versionfind (GNU findutils) 4.4.2

ฉันได้รับข้อผิดพลาดต่อไปนี้:

mycomputer:~/new$ find . -mtime -60s
find: missing argument to `-mtime'
mycomputer:~/new$ find . -mtime -60seconds
find: missing argument to `-mtime'

อย่างไรก็ตามฉันสามารถใช้-mmin(สำหรับการแก้ไขในนาทีสุดท้าย) และสามารถใช้ในการโต้แย้งทศนิยม; เช่นไฟล์ต่อไปนี้ค้นหาไฟล์ที่ถูกแก้ไขใน 30 วินาทีที่ผ่านมา

find . -mmin 0.5

ตัวอย่างเช่น การสร้างไฟล์ที่แก้ไขล่าสุด 1 วินาที, 6 วินาที, 11 วินาที, ... ที่ผ่านมาเป็นเวลา 120 วินาทีที่ผ่านมาคำสั่งนี้จะค้นหา:

mycomputer:~/new$ for i in $(seq 1 5 120); do touch -d "-$i seconds" last_modified_${i}_seconds_ago ; done
mycomputer:~/new$ find . -mmin 0.5
.
./last_modified_1_seconds_ago
./last_modified_26_seconds_ago
./last_modified_11_seconds_ago
./last_modified_16_seconds_ago
./last_modified_21_seconds_ago
./last_modified_6_seconds_ago

ดังนั้นหากคุณต้องการภายในไม่กี่วินาทีคุณสามารถทำสิ่งต่อไปนี้:

localhost:~/new$ for i in $(seq 1 1 120); do touch -d "-$i seconds" last_modified_${i}_seconds_ago ; done
localhost:~/new$ N=18; find . -mmin $(echo "$N/60"|bc -l)
./last_modified_1_seconds_ago
./last_modified_9_seconds_ago
./last_modified_14_seconds_ago
./last_modified_4_seconds_ago
./last_modified_12_seconds_ago
./last_modified_13_seconds_ago
./last_modified_8_seconds_ago
./last_modified_3_seconds_ago
./last_modified_5_seconds_ago
./last_modified_11_seconds_ago
./last_modified_17_seconds_ago
./last_modified_16_seconds_ago
./last_modified_7_seconds_ago
./last_modified_15_seconds_ago
./last_modified_10_seconds_ago
./last_modified_6_seconds_ago
./last_modified_2_seconds_ago

8

คล้ายกับสิ่งที่เกล็นแนะนำถ้าคุณต้องการค้นหาทุกสิ่งที่ได้รับการดัดแปลงพูดในระหว่างที่กระบวนการติดตั้งทำงานอยู่อาจเป็นการง่ายกว่าที่จะทำสิ่งต่าง ๆ เช่น:

touch /tmp/checkpoint
<do installer stuff>
find / -newer /tmp/checkpoint

จากนั้นคุณไม่ต้องทำการคำนวณเวลา คุณเพิ่งพบสิ่งต่าง ๆ ที่เปลี่ยนแปลงหลังจากไฟล์จุดตรวจ


6

หากคุณมีรุ่นของการค้นหาที่ไม่สนับสนุน-mtime -60sวิธีการแก้ปัญหาที่ดีกว่าก็คือ

touch -d '-60 seconds' /tmp/newerthan
find . -name "*.txt" -newer /tmp/newerthan

6

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือ:

find . -name "*.txt" -newermt '6 seconds ago'

-mtime -60sตัวเลือกที่กล่าวถึงในคำตอบไม่ทำงานบนหลายรุ่นของfindแม้ในปี 2016 -newermtเป็นตัวเลือกที่ดีมากกับเรา มันสามารถแยกรูปแบบวันที่และเวลาที่แตกต่างกันมากมาย

วิธีอื่นที่ใช้mminคือ:

find . -name "*.txt" -mmin -0.5

# Finds files modified within the last 0.5 minute, i.e. last 30 seconds

ตัวเลือกนี้อาจใช้ไม่ได้กับทุกfindรุ่น


2
นี่เป็นทางออกที่ดีที่สุดอย่างชัดเจน
rednoah


1

หากเวอร์ชันของคุณfindไม่ยอมรับวินาทีหรือค่าจริงเช่นเดียวกับของฉันใช้-mminแต่ระบุ 0 และคุณจะได้รับไฟล์ทั้งหมดที่แก้ไขภายในเวลาไม่ถึงนาที:

$ touch test; find . -type f -mmin 0
./test
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.