มีคำสั่ง Linux ในตัวเพื่อแสดงเนื้อหาของไดเรกทอรีแบบเรียลไทม์หรือไม่?


8

มีคำสั่ง Linux ในตัวเพื่อแสดงเนื้อหาของไดเรกทอรีแบบเรียลไทม์หรือไม่คล้ายกับคำสั่ง "tail -f file_name" ซึ่งแสดงเนื้อหาของไฟล์แบบเรียลไทม์


4
แล้วไงwatch -n1 ls
โจ

ดูนาฬิกา ( linfo.org/watch.html )
David Segonds

4
ไม่ใช่ในตัว แต่inotifytoolsแพ็คเกจใช้inotifyคุณสมบัติของ Linux เพื่อให้สามารถรับชมเหตุการณ์การสร้างไฟล์ได้
chepner

คำตอบ:


6

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.

1
หากคุณต้องการดูไฟล์ใหม่ที่ชัดเจนยิ่งขึ้นใช้ls -ltเพื่อดูไฟล์ใหม่ที่ด้านบนของรายชื่อหรือls -ltrเพื่อดูไฟล์ใหม่ที่ด้านล่าง จากนั้นหากต้องการเน้นไฟล์ใหม่เหล่านั้นให้ใช้watch -dเพื่อเน้นการเปลี่ยนแปลงในการอัปเดตล่าสุดหรือwatch --differences=cumulativeเพื่อเน้นการเปลี่ยนแปลงทั้งหมดตั้งแต่watchเริ่มต้น
garyjohn

@ jm666 - watch tail lsหรือwatch head lsจะแสดงไฟล์ล่าสุดที่ถูกต้องคำสั่ง lsตัวเลือกการสั่งซื้อเช่น-ltกับหัวหรือ-ltrกับหาง
AFH

@ jm666 - แน่นอนมันเป็นเรื่องไร้สาระถ้าถ่ายตัวอักษร: ผมก็ใช้มันเป็นชื่อย่อสำหรับwatch {options} 'ls {options} | tail {options}'
AFH

@ jm666: การร้องขอสำหรับคำสั่งที่ติดตามการเปลี่ยนแปลงไดเรกทอรีtail -fดังต่อไปนี้การเปลี่ยนแปลงไฟล์ คำสั่งดั้งเดิมของคุณคือสิ่งที่watchทำได้ไม่ดีนัก ฉันคิดว่ามันจะถ้าคำสั่งมันทำงานถูกสร้างขึ้นอย่างเหมาะสม บางครั้งคุณต้องใช้sh -cคำสั่งที่ซับซ้อนมากขึ้น ฉันดู inotify-tools สั้น ๆ และไม่เห็นคำสั่งที่จะแสดงการเปลี่ยนแปลงในไดเรกทอรีไม่ใช่เฉพาะเหตุการณ์ที่นำไปใช้กับไดเรกทอรี
garyjohn

2

ฉันเขียนสิ่งนี้ฉันหวังว่านี่คือสิ่งที่คุณต้องการ มันไม่ใช่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สูญเสียคุณค่าหลังจากทำลูปที่ทำให้สคริปต์แสดงทุกอย่างเหมือนใหม่ทุกครั้งบนเครื่องลินุกซ์บางเครื่อง
NuTTyX


0

คุณสามารถใช้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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.