วิธีใช้ inotifywait เพื่อดูไดเร็กทอรีสำหรับการสร้างไฟล์ของส่วนขยายเฉพาะ


21

ฉันเห็นคำตอบนี้แล้ว

คุณควรพิจารณาใช้ inotifywait เป็นตัวอย่าง:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

คำถามของฉันคือสคริปต์ข้างต้นดูไดเรกทอรีสำหรับการสร้างไฟล์ทุกประเภท แต่ฉันจะแก้ไขinotifywaitคำสั่งเพื่อรายงานได้เฉพาะเมื่อไฟล์ประเภท / นามสกุลที่แน่นอนถูกสร้างขึ้น (หรือย้ายไปยังไดเรกทอรี) - เช่นควร รายงานเมื่อ.xmlมีการสร้างไฟล์ใด ๆ

ฉันลองอะไร:

ฉันรันinotifywait --helpคำสั่งแล้วและอ่านตัวเลือกบรรทัดคำสั่ง มันมี--exclude <pattern>และ--excludei <pattern>คำสั่งในการยกเว้นไฟล์บางประเภท (โดยใช้ regEx) แต่ฉันต้องการวิธีที่จะรวมเพียงแค่ไฟล์ประเภท / นามสกุลที่แน่นอน


BTW การใช้pathข้างต้นอาจไม่ใช่ชื่อตัวแปรที่ดีที่สุดหากคุณต้องการเล่นกับเชลล์ตัวแรก PATHถ้าคุณใช้มันแล้วคุณจะไม่สามารถที่จะใช้คำสั่งและทุกอย่างตั้งแต่นี้มีพื้นเพียงแทนที่มาตรฐาน ดังนั้นฉันแนะนำให้ใช้ชื่อ var อื่นเช่นfpathแทน นั่นคือwhile read fpath action fileคำสั่งมาตรฐานใด ๆ ที่มักจะมีให้จากเชลล์ของคุณ
Baptiste Mathus

มันเป็นเรื่องไร้สาระที่ไม่มีตัวเลือกในการรวม
erandros

คำตอบ:


17

ฉันจะแก้ไขคำสั่ง inotifywait เพื่อรายงานเฉพาะเมื่อไฟล์ประเภท / นามสกุลที่แน่นอนถูกสร้างขึ้น

โปรดทราบว่านี่เป็นรหัสที่ยังไม่ทดสอบเนื่องจากฉันไม่สามารถเข้าถึงได้ในinotifyขณะนี้ แต่สิ่งที่คล้ายกับเรื่องนี้ควรจะทำงาน:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        if [[ "$file" =~ .*xml$ ]]; then # Does the file end with .xml?
            echo "xml file" # If so, do your thing here!
        fi
    done

2
มันใช้งานได้และฉันได้ทำการทดสอบด้วย inotifywait
TheBetterJORT

1
คุณทำงานนี้ได้อย่างไร มันเป็นคำสั่งแบบใช้ครั้งเดียวหรือจำเป็นต้องใช้ในการวนซ้ำหรืออะไรทำนองนั้น อาจเป็นส่วนหนึ่งของincron(ฉันหวังว่าไม่)
SDsolar

@SDsolar มันแตกต่างกันไป สำหรับฉันฉันมักจะเรียกใช้inotifyด้วยnohupหรือเริ่มด้วยบริการ systemd ที่กำหนดเอง ส่วนใหญ่มักจะเป็นหลัง
maulinglawns

9

ใช้ค่าลบสองเท่า:

inotifywait -m --exclude "[^j][^s]$" /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
    done

ซึ่งจะรวมถึงไฟล์จาวาสคริปต์เท่านั้น


1
ดีฉันชอบที่มันเปลี่ยนการกรองinotifywaitมากกว่าที่จะสร้างผลลัพธ์ขนาดใหญ่สำหรับไฟล์ทั้งหมดและตัวกรองหลังจากนั้น (เช่นในคำตอบอื่น ๆ ) ยังไม่ได้ลอง แต่ฉันเดาว่ามันจะทำงานได้เร็วขึ้นเล็กน้อย
TMG

นี่คือสิ่งที่ฉันกำลังมองหา วิธีปรับเปลี่ยน--excludeอินพุตเพื่อดู.extไฟล์ สิ่งนี้รันเพียงหนึ่งครั้งหรือใน for for loop?
kurokirasama

มันเป็นภูตดังนั้นมันจะทำงานจนกว่ามันจะล้มเหลวหรือคุณปิดมันลง :)
Jonas Earendel

ขออภัยพลาดคำถามแรก inotifywait -m --exclude "[^.][^e][^x][^t]$" /home/jonas/Skrivbord/test -e create -e moved_to | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" done ฉันแน่ใจว่า regex สามารถเพิ่มประสิทธิภาพ แต่ผลงานที่ลูกนี้ :)
โจนัส Earendel

thanxs !! ฉันจะลองดูสิ !!
kurokirasama

3

ในขณะที่วิธีการลบคำตอบก่อนหน้านี้เป็นความคิดที่ดีเนื่องจาก (ตามที่ TMG ระบุไว้) มันเปลี่ยนงานการกรองเป็นจริงinotifywaitแต่ก็ไม่ถูกต้อง

ตัวอย่างเช่นหากไฟล์ลงท้ายด้วยไฟล์asนั้นจะไม่ตรงกัน[^j][^s]$เนื่องจากตัวอักษรสุดท้ายsไม่ตรงกัน[^s]ดังนั้นจึงจะไม่ถูกยกเว้น

ในเงื่อนไขบูลีนหากSเป็นข้อความ:

"ตัวอักษรตัวสุดท้ายคือs"

และJเป็นคำสั่ง:

"ตัวอักษรสุดท้ายคือj"

แล้วค่าของ--excludeพารามิเตอร์ความหมายควรถือเอาnot(J and S)ซึ่งโดยกฎเดอมอร์แกนnot(J) or not(S)เป็น

อีกปัญหาที่อาจเกิดขึ้นก็คือว่าในzsh, $pathเป็นตัวในตัวแปรที่เป็นตัวแทนของเทียบเท่าอาร์เรย์ของ$PATHดังนั้นwhile read path ...สายสมบูรณ์จะเลอะ$PATHและสาเหตุที่ทุกอย่างจะกลายเป็น unexecutable จากเชลล์

ดังนั้นวิธีการที่ถูกต้องคือ:

inotifywait -m --exclude "[^j].$|[^s]$" /path -e create -e moved_to |
    while read dir action file; do
        echo "The file '$file' appeared in directory '$dir' via '$action'"
    done

โปรดสังเกตสิ่ง.ที่จำเป็นหลังจากนั้น[^j]เพื่อให้แน่ใจว่าการจับคู่ถูกนำไปใช้ในตำแหน่งสุดท้ายและ|ไม่ควรหลีกเลี่ยงอักขระ (แทนบูลีนหรือที่กล่าวถึงข้างต้น) ที่นี่เนื่องจาก--excludePOSIX ขยายนิพจน์ปกติ

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