มีคำสั่ง Linux ในตัวเพื่อแสดงเนื้อหาของไดเรกทอรีแบบเรียลไทม์หรือไม่คล้ายกับคำสั่ง "tail -f file_name" ซึ่งแสดงเนื้อหาของไฟล์แบบเรียลไทม์
inotifytools
แพ็คเกจใช้inotify
คุณสมบัติของ Linux เพื่อให้สามารถรับชมเหตุการณ์การสร้างไฟล์ได้
มีคำสั่ง Linux ในตัวเพื่อแสดงเนื้อหาของไดเรกทอรีแบบเรียลไทม์หรือไม่คล้ายกับคำสั่ง "tail -f file_name" ซึ่งแสดงเนื้อหาของไฟล์แบบเรียลไทม์
inotifytools
แพ็คเกจใช้inotify
คุณสมบัติของ Linux เพื่อให้สามารถรับชมเหตุการณ์การสร้างไฟล์ได้
คำตอบ:
watch
คุณสามารถทำได้โดยใช้ มันไม่ได้เป็นแบบเรียลไทม์ แต่ใกล้พอ (มากถึงสิบวินาที):
watch -n0.1 ls
จากคู่มือ:
-n, --interval seconds
Specify update interval. The command will not allow quicker than 0.1 second interval, in which the smaller values are converted.
ls -lt
เพื่อดูไฟล์ใหม่ที่ด้านบนของรายชื่อหรือls -ltr
เพื่อดูไฟล์ใหม่ที่ด้านล่าง จากนั้นหากต้องการเน้นไฟล์ใหม่เหล่านั้นให้ใช้watch -d
เพื่อเน้นการเปลี่ยนแปลงในการอัปเดตล่าสุดหรือwatch --differences=cumulative
เพื่อเน้นการเปลี่ยนแปลงทั้งหมดตั้งแต่watch
เริ่มต้น
watch tail ls
หรือwatch head ls
จะแสดงไฟล์ล่าสุดที่ถูกต้องคำสั่ง lsตัวเลือกการสั่งซื้อเช่น-ltกับหัวหรือ-ltrกับหาง
watch {options} 'ls {options} | tail {options}'
tail -f
ดังต่อไปนี้การเปลี่ยนแปลงไฟล์ คำสั่งดั้งเดิมของคุณคือสิ่งที่watch
ทำได้ไม่ดีนัก ฉันคิดว่ามันจะถ้าคำสั่งมันทำงานถูกสร้างขึ้นอย่างเหมาะสม บางครั้งคุณต้องใช้sh -c
คำสั่งที่ซับซ้อนมากขึ้น ฉันดู inotify-tools สั้น ๆ และไม่เห็นคำสั่งที่จะแสดงการเปลี่ยนแปลงในไดเรกทอรีไม่ใช่เฉพาะเหตุการณ์ที่นำไปใช้กับไดเรกทอรี
ฉันเขียนสิ่งนี้ฉันหวังว่านี่คือสิ่งที่คุณต้องการ มันไม่ใช่built-in Linux command
แต่ใช้เฉพาะโปรแกรมทั่วไปที่มีอยู่ในกล่อง UNIX ส่วนใหญ่
ปรับsleep
เวลาตามต้องการ ฉันจะใช้ค่าอย่างน้อย 2 วินาที ใช้cmd="ls"
สำหรับโครงสร้างที่ไม่ใช่แบบเรียกซ้ำหรือcmd="find DIRNAME"
เพื่อค้นหาแบบเรียกซ้ำ โปรดทราบว่าในกรณีสุดท้ายคุณจะได้รับส่วนDIRNAME/
นำหน้าไปยังไฟล์และไดเรกทอรีทั้งหมด
echo "" | awk '{while ( 1 ) {cmd="find ."; delete b;c=0; while ( ( cmd | getline result ) > 0 ) {test=1;c++;n=0;for (i in a) {n++;if (a[i]==result) {b[c]=i; test=0; break;}} if (test) {n++;a[n]=result;b[c]=n;print "##NEW## "result }} close (cmd); for (i in a) {test=1;for (j in b) {if (b[j]==i) {test=0;break}} if (test) {print "##DELETED## "a[i]; delete a[i]}} system("sleep 5") } }'
i
สูญเสียคุณค่าหลังจากทำลูปที่ทำให้สคริปต์แสดงทุกอย่างเหมือนใหม่ทุกครั้งบนเครื่องลินุกซ์บางเครื่อง
มันง่ายมากหลังจากที่ฉันรู้
watch -d dir_name
คุณสามารถใช้inotifytools
และอรรถประโยชน์บรรทัดคำสั่งของมัน
คุณสามารถใช้inotify
ในการตรวจสอบไดเรกทอรีและมันจะส่งคืนเหตุการณ์สำหรับไดเรกทอรีเองและไฟล์ภายในไดเรกทอรี
เครื่องมืออื่นที่สามารถใช้ได้คือinotifywatch
:
sudo inotifywatch -v -r /foo
คุณสามารถเพิ่ม-r
เพื่อดูไดเรกทอรีย่อยทั้งหมดซ้ำ อย่างไรก็ตามการแก้ปัญหานี้ไม่พบการเปลี่ยนแปลงเกี่ยวกับไฟล์ที่สร้างขึ้นใหม่
ดังนั้นอีกวิธีคือการใช้inotifywait
:
inotifywait -m --format "%f" /foo
นี่เป็นอีกตัวอย่างของการแสดงเนื้อหาของtest*
ไฟล์ที่สร้างขึ้นใหม่ทั้งหมดใน/tmp
:
inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null
watch -n1 ls