ฉันต้องการคำสั่ง Linux เพื่อค้นหาไฟล์ที่เปลี่ยนแปลงในไม่n
กี่วินาทีที่ผ่านมา
มีเชลล์สคริปต์หรือเครื่องมืออื่น ๆ ที่ฉันสามารถเรียกใช้จากอินเตอร์เฟสบรรทัดคำสั่งหรือ GUI ได้หรือไม่?
ฉันต้องการคำสั่ง Linux เพื่อค้นหาไฟล์ที่เปลี่ยนแปลงในไม่n
กี่วินาทีที่ผ่านมา
มีเชลล์สคริปต์หรือเครื่องมืออื่น ๆ ที่ฉันสามารถเรียกใช้จากอินเตอร์เฟสบรรทัดคำสั่งหรือ GUI ได้หรือไม่?
คำตอบ:
ใช้คำสั่ง find แบบนี้:
find . -name "*.txt" -mtime -60s
เพื่อค้นหา*.txt
ไฟล์ทั้งหมดที่แก้ไขใน 60 วินาทีที่ผ่านมา
-mtime
ไม่ได้เป็นข้อโต้แย้งที่ถูกต้อง ไม่เป็น "60s" แม้แต่ตัวเลือกที่ถูกต้องใน POSIX หรือ GNU find อาร์กิวเมนต์-mtime
เป็นหมายเลขที่ระบุจำนวนรอบระยะเวลา 24 ชั่วโมงที่ผ่านมาเมื่อแก้ไขไฟล์
วิธีการแก้ปัญหาที่มีการระบุ mtime วินาทีไม่ทำงานบนระบบลินุกซ์ของฉันที่ใช้==find --version
find (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
คล้ายกับสิ่งที่เกล็นแนะนำถ้าคุณต้องการค้นหาทุกสิ่งที่ได้รับการดัดแปลงพูดในระหว่างที่กระบวนการติดตั้งทำงานอยู่อาจเป็นการง่ายกว่าที่จะทำสิ่งต่าง ๆ เช่น:
touch /tmp/checkpoint
<do installer stuff>
find / -newer /tmp/checkpoint
จากนั้นคุณไม่ต้องทำการคำนวณเวลา คุณเพิ่งพบสิ่งต่าง ๆ ที่เปลี่ยนแปลงหลังจากไฟล์จุดตรวจ
หากคุณมีรุ่นของการค้นหาที่ไม่สนับสนุน-mtime -60s
วิธีการแก้ปัญหาที่ดีกว่าก็คือ
touch -d '-60 seconds' /tmp/newerthan
find . -name "*.txt" -newer /tmp/newerthan
วิธีที่ง่ายที่สุดในการทำเช่นนี้คือ:
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
รุ่น
หากคุณกำลังตรวจสอบไดเรกทอรีสำหรับการเปลี่ยนแปลงไฟล์คุณอาจต้องการใช้inotify-toolsแทนการวนโพลที่ไม่สิ้นสุด
หากเวอร์ชันของคุณfind
ไม่ยอมรับวินาทีหรือค่าจริงเช่นเดียวกับของฉันใช้-mmin
แต่ระบุ 0 และคุณจะได้รับไฟล์ทั้งหมดที่แก้ไขภายในเวลาไม่ถึงนาที:
$ touch test; find . -type f -mmin 0
./test
find: missing argument to `-mtime'
ผมได้รับข้อผิดพลาดกับคำสั่งนี้: อย่างไรก็ตามฉันสามารถรับพฤติกรรมที่ต้องการโดยใช้ -mmin และอาร์กิวเมนต์ทศนิยม ฉันไม่พบข้อมูลอ้างอิงใด ๆ ใน manpage เพื่อหาเพื่อใช้s
เป็นอาร์กิวเมนต์