Bash script เพื่อตรวจสอบการเปลี่ยนแปลงไฟล์และดำเนินการคำสั่ง


12

ฉันมีโฟลเดอร์ที่มีโฟลเดอร์ย่อยมากมายโฟลเดอร์เหล่านี้มีasciidoctorรูปแบบการจัดเก็บพร้อม.adocส่วนขยาย

ทุกครั้งที่ฉันทำการเปลี่ยนแปลงไฟล์ (ซึ่งบ่อยครั้ง) ฉันต้องเรียกใช้

asciidoctor -q filename.adoc

เพื่อรวบรวมเป็นรูปแบบ HTML

ฉันพยายามทำให้กระบวนการเป็นไปโดยอัตโนมัติ จนถึงตอนนี้ฉันได้มากับสิ่งนี้โดยใช้entr :

ls *.adoc | entr asciidoctor -q *.adoc

แต่ใช้ได้กับโฟลเดอร์ที่มีอยู่เท่านั้นไม่ใช่โฟลเดอร์ย่อย ฉันได้ลองชุดรูปแบบนี้ แต่มันไม่ทำงาน:

find . -name '*.adoc' | entr asciidoctor -q *.adoc

ความคิดใด ๆ ที่ฉันสามารถใช้กระบวนการอัตโนมัตินี้สำหรับโฟลเดอร์ย่อยทั้งหมดได้อย่างไร


คำตอบ:


17

Linux มีอินเทอร์เฟซที่ดีสำหรับการตรวจสอบเหตุการณ์ของระบบไฟล์ทั้งหมดเช่นการสร้างการแก้ไขการลบไฟล์ อินเทอร์เฟซคือinotifyตระกูลของการเรียกใช้ระบบยูทิลิตี้ userspace ที่ใช้ประโยชน์จากการโทรเหล่านี้จัดทำโดยinotify-toolsแพคเกจใน Ubuntu (มีอยู่ในที่เก็บจักรวาล) หากคุณยังไม่มีให้ติดตั้งโดย:

sudo apt-get install inotify-tools

inotify-toolsให้inotifywaitและinotifywatchไบนารีเราต้องการคนแรก


ดังนั้นคุณต้องการเรียกใช้คำสั่งasciidoctor -q some_fileเมื่อ.adocมีการแก้ไขไฟล์ใด ๆ( some_fileจะถูกแทนที่ด้วย) หากสมมติว่า.adocไฟล์ของคุณอยู่ในไดเรกทอรี/foo/barคุณสามารถตั้งค่าการตรวจสอบ:

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
  • -qเปิดใช้งานโหมดเงียบไม่มีข้อมูลจากinotifywaitตัวเอง

  • -m เปิดใช้งานโหมดจอภาพมิฉะนั้นจะออกหลังจากเหตุการณ์แรก

  • --event modifyเราสนใจเฉพาะmodifyเหตุการณ์เช่นเมื่อไฟล์ถูกแก้ไข ค่าที่เป็นไปได้อื่น ๆ ได้แก่open, closeฯลฯ

  • --format %wเราต้องการแค่ชื่อไฟล์ที่ถูกแก้ไขแทนที่จะเป็นมัดข้อมูลอื่น ๆ เพราะเราจะใช้ชื่อไฟล์เป็นอินพุตไปยังคำสั่งอื่น

  • /foo/bar/*.adocจะถูกขยายเป็น.adocไฟล์ทั้งหมดภายใต้/foo/barไดเรกทอรี


ตอนนี้ข้างต้นจะแสดงชื่อไฟล์ของคุณเมื่อใดก็ตามที่มีการแก้ไขใด ๆ ตอนนี้ให้เรียกใช้คำสั่งในชื่อไฟล์ (สมมติว่าคำสั่งใช้อาร์กิวเมนต์ผ่าน STDIN):

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc | asciidoctor -q

คุณยังสามารถตั้งค่านาฬิกาแบบเรียกซ้ำในไดเรกทอรีจากนั้นคุณจะต้องใช้grepเพื่อกรองไฟล์ที่ต้องการเท่านั้น ที่นี่การตั้งค่านาฬิกาซ้ำ ( -r) ในไดเรกทอรี/foo/barและใช้grepในการกรอง.adocไฟล์เท่านั้น:

inotifywait -qrm --event modify --format '%w%f' /foo/bar | grep '\.adoc$' | asciidoctor -q

เมื่อดูไดเรกทอรีตัวระบุรูปแบบผลลัพธ์%wจะเปลี่ยนเป็นชื่อไดเรกทอรีดังนั้นเราจำเป็นต้อง%fได้รับชื่อไฟล์ ในขณะที่ดูไฟล์%fจะแก้ไขเป็นสตริงว่าง

โปรดทราบว่าคุณยังสามารถเรียกใช้inotifywaitใน-dโหมดdaemon ( ) คุณยังสามารถเขียนสคริปต์ทั้งหมดและ / หรือทำงานในพื้นหลังและ / หรือเล่นกับตัวเลือกอื่น ๆ

นอกจากนี้คุณสามารถแทนที่asciidoctorด้วยคำสั่งอื่น ๆ ที่คุณเลือกหากคุณต้องการ

ตรวจสอบman inotifywaitเพื่อรับแนวคิดเพิ่มเติม


ขอบคุณมันใช้งานได้ ฉันยังมีสิ่งที่คล้ายกันสำหรับ OSX แต่ฉันเดาว่านี่ไม่ใช่สถานที่ที่เหมาะสมที่จะถาม
รำ

@ แบรนใช่ IMHO ไปที่ULคุณสามารถใช้สิ่งนี้เป็นข้อมูลอ้างอิงได้
heemayl

คำตอบที่ดีเพียงแก้ไขเล็กน้อย -q ทำให้โปรแกรม "verbose น้อย", -qq (double q) ทำให้มันเงียบสนิทยกเว้นข้อผิดพลาดร้ายแรง
jotadepicas

4

การใช้inotifywaitเป็นวิธีการทั่วไป แต่ยังมียูทิลิตีแยกต่างหากที่เรียกinotify-hookableว่าให้คุณเรียกใช้คำสั่งเมื่อมีการเปลี่ยนแปลงไฟล์ (หรือไดเรกทอรี):

inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'

ดูเหมือนว่าจะออกหลังจากเรียกคำสั่งครั้งเดียว; ฉันไม่เห็นตัวเลือกสำหรับการดูอย่างต่อเนื่องดังนั้นคุณสามารถทำสิ่งที่ชอบ:

while true; do
    inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'
    echo "== $(date) : executed, continuing to monitor..."
done

หมายเหตุมีตัวเลือกในการตรวจสอบหลายไฟล์หรือไดเรกทอรีซ้ำและตัวเลือกเพื่อละเว้นไฟล์ / เส้นทาง


inotify-hookable ไม่ออกหลังจากรันคำสั่งสำหรับฉัน อืม
สูงสุด

inotify-hookable ถูกติดตั้งจากแพ็คเกจอื่น:sudo apt-get install inotify-hookable
Bruno Silvano

3

มีเครื่องมือมากมายโดยเฉพาะถ้าคุณค้นหาในที่เก็บของคุณ

apt-cache search monitor | grep file

ซึ่งทำให้เรามีเครื่องมือมากมาย แต่คุณไม่ต้องทดสอบพวกเขาเพราะฉันทำอย่างนั้น

ฉันได้ทดสอบเครื่องมือเหล่านี้และอื่น ๆ อีกมากมาย:

  • inotify
  • fswatch
  • filewatch
  • แถบ
  • fileschanged
  • Entr

ในบรรดาเครื่องมือเหล่านี้ฉันพบสามเครื่องมือที่มีประโยชน์และเชื่อถือได้

  • direvent | GNU เขียนใน C
  • iwatch | ใน Perl
  • fsniper

และระหว่างสามคนนี้ผู้ที่ได้รับรางวัลดีที่สุดอย่างไม่ต้องสงสัย

มันมีประโยชน์และเชื่อถือได้ในการใช้งานที่ฉันได้ใช้เพื่อไปป์ไลน์อย่างง่ายด้วย microservices ของฉันที่ฉันมี

direvent.conf ไฟล์สำหรับการดู

syslog {
    facility local0;
    tag "direvent";
    print-priority yes;
}

watcher {
    path /var/www/html/ir/jsfun/build/react recursive;
    file "*.js";
    event write;
    command "/usr/bin/xdotool search --onlyvisible  --class firefox key F5";
    option (stdout, stderr, wait);
}

นี่เป็นเพียงหนึ่งในไฟล์ปรับแต่งที่ฉันมีซึ่งเมื่อใดก็ตามที่มีการเปลี่ยนแปลงสำหรับการเขียนคำสั่งนี้จะถูกดำเนินการ - ซึ่งอาจเป็นสคริปต์เช่นกัน

ไม่จำเป็นต้องใช้การwhileวนซ้ำหรือสิ่งอื่น ๆ


คุณสมบัติ

  • ดูไดเรกทอรีซ้ำ ๆ
  • สามารถทำงานในเบื้องหน้าหรือพื้นหลังเป็น daemon
  • แบบพกพา ฉันมีมันใน Ubuntu และเซิร์ฟเวอร์ CentOS7
  • รายงานชื่อไฟล์
  • regex เพื่อรองรับการจับคู่ไฟล์
  • การดูไฟล์ mulit (ดูไฟล์มากกว่าหนึ่งประเภท)
  • ประสานคำสั่งการดำเนินการ
  • การจัดการ syslog (เข้าสู่ syslog ถ้าเราต้องการ)
  • ง่ายและดี CLI และการออกแบบไฟล์กำหนดค่าให้ทำงานกับ

พัฒนาโดยSergey Poznyakoff


การติดตั้ง

sudo apt install direvent

แต่การติดตั้งโดยใช้ซอร์สโค้ดนั้นค่อนข้างง่ายและตรงไปตรงมาซึ่งให้เวอร์ชั่นล่าสุด (ตอนนี้คือ: 5.1)


-3

ดีฉันขอแนะนำต่อไปนี้

#!/bin/bash
#Script
for SRC in *.adoc; 
      do
      asciidoctor -q $SRC
  done

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