Tập lệnh Bash để theo dõi thay đổi tập tin và thực thi lệnh


12

Tôi có một thư mục với một loạt các thư mục con, các thư mục này đã được tạo thành asciidoctorvới .adocphần mở rộng.

Mỗi lần tôi thay đổi tập tin (thường là) tôi cần chạy

asciidoctor -q filename.adoc

để biên dịch nó thành định dạng HTML.

Tôi đang cố gắng tự động hóa quá trình. Cho đến nay tôi đã sử dụng entr này :

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

nhưng chỉ hoạt động với thư mục hiện có không dành cho thư mục con. Tôi đã thử biến thể này, nhưng nó không hoạt động:

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

Bất kỳ ý tưởng làm thế nào tôi có thể thực hiện quá trình tự động hóa này cho tất cả các thư mục con?


1
Bản sao có thể có của Cách bạn phát hiện các thay đổi tệp
Anwar

Câu trả lời:


17

Linux cung cấp một giao diện đẹp để theo dõi tất cả các sự kiện hệ thống tệp như tạo, sửa đổi, xóa tệp. Giao diện là inotifyhọ của các cuộc gọi hệ thống, các tiện ích không gian người dùng tận dụng các cuộc gọi này được cung cấp bởi inotify-toolsgói trong Ubuntu (có sẵn trên kho vũ trụ). Nếu bạn chưa có nó, hãy cài đặt bằng cách:

sudo apt-get install inotify-tools

inotify-toolscung cấp inotifywaitinotifywatchnhị phân, chúng ta cần cái đầu tiên.


Vì vậy, bạn muốn chạy lệnh asciidoctor -q some_filekhi bất kỳ .adoctệp nào được sửa đổi ( some_filesẽ được thay thế bởi điều đó), nếu vậy giả sử các .adoctệp của bạn nằm trong thư mục /foo/bar, bạn có thể đặt đồng hồ:

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
  • -qcho phép chế độ im lặng, không có thông tin từ inotifywaitchính nó

  • -m cho phép chế độ màn hình, nếu không nó sẽ thoát sau sự kiện đầu tiên

  • --event modify, chúng tôi chỉ quan tâm đến modifysự kiện tức là khi một tệp được sửa đổi. Các giá trị khác có thể bao gồm open, closev.v.

  • --format %w, chúng tôi chỉ muốn tên tệp được sửa đổi thay vì bó thông tin khác vì chúng tôi sẽ sử dụng tên tệp làm đầu vào cho lệnh khác

  • /foo/bar/*.adocsẽ được mở rộng cho tất cả .adoccác tập tin trong /foo/barthư mục


Bây giờ ở trên sẽ hiển thị cho bạn tên tệp bất cứ khi nào được sửa đổi, bây giờ để chạy lệnh trên tên tệp (giả sử lệnh lấy đối số qua STDIN):

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

Bạn cũng có thể thiết lập đồng hồ đệ quy trên thư mục, sau đó bạn sẽ chỉ cần sử dụng grepđể lọc các tệp mong muốn. Ở đây thiết lập đồng hồ đệ quy ( -r) trên thư mục /foo/barvà sử dụng grepđể chỉ lọc .adoccác tệp:

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

Khi xem các thư mục, bộ xác định định dạng đầu ra %wsẽ phân giải thành tên thư mục, vì vậy chúng ta cần %flấy tên tệp. Trong khi xem các tập tin, %fsẽ giải quyết chuỗi rỗng.

Lưu ý rằng, bạn cũng có thể chạy inotifywaittrong -dchế độ daemon ( ), bạn cũng có thể tạo kịch bản cho toàn bộ nội dung và / hoặc chạy ở chế độ nền và / hoặc chơi với nó nhiều tùy chọn khác.

Ngoài ra, bạn có thể thay thế asciidoctorbằng bất kỳ lệnh nào khác mà bạn chọn, nếu bạn muốn.

Kiểm tra man inotifywaitđể có thêm ý tưởng.


Cảm ơn nó đã làm việc. Tôi cũng có một cái gì đó tương tự cho OSX. nhưng tôi đoán đây không phải là nơi thích hợp để hỏi
cám

@bran Có, IMHO đi đến UL , bạn có thể sử dụng nó làm tài liệu tham khảo.
heemayl

Câu trả lời tuyệt vời, chỉ là một sửa chữa nhỏ. -q làm cho chương trình "ít dài dòng", -qq (gấp đôi q) làm cho nó hoàn toàn im lặng trừ các lỗi nghiêm trọng.
jotadepicas

4

Sử dụng inotifywaitlà cách tiếp cận thông thường, nhưng cũng có một tiện ích riêng gọi là inotify-hookablechỉ cho phép bạn chạy lệnh khi một tệp (hoặc thư mục) thay đổi:

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

Nó dường như thoát ra sau khi kích hoạt lệnh một lần; Tôi không thấy tùy chọn để xem liên tục, vì vậy bạn có thể làm một cái gì đó như:

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

Lưu ý có các tùy chọn để giám sát một số tệp hoặc một thư mục, theo cách đệ quy và các tùy chọn để bỏ qua các tệp / đường dẫn.


inotify-hookable không thoát sau khi chạy lệnh cho tôi. Hmm
Tối đa

inotify-hookable được cài đặt từ một gói khác:sudo apt-get install inotify-hookable
Bruno Silvano

2

Có nhiều công cụ hiện có, đặc biệt nếu bạn tìm kiếm trong kho lưu trữ của mình

apt-cache search monitor | grep file

cung cấp cho chúng tôi nhiều công cụ. Nhưng bạn không phải kiểm tra chúng vì tôi đã làm điều đó.

Tôi đã thử nghiệm các công cụ này và nhiều công cụ khác:

  • inotify
  • fswatch
  • tập tin
  • mẫu màu
  • trao đổi tập tin
  • nhập

Trong số các công cụ này, tôi thấy ba trong số chúng hữu ích và đáng tin cậy:

  • thảm khốc | GNU viết bằng C
  • iwatch | ở Perl
  • fsniper

Và giữa ba người này, direvent là tốt nhất không có nghi ngờ gì.

Nó rất hữu ích và đáng tin cậy để sử dụng mà tôi đã sử dụng nó cho một đường ống đơn giản với các dịch vụ siêu nhỏ mà tôi có.

direvent.conf tập tin để xem

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);
}

Đây chỉ là một trong những tập tin cấu hình mà tôi có trong đó bất cứ khi nào có thay đổi để ghi thì lệnh này được thực thi - cũng có thể là tập lệnh .

Không cần phải sử dụng whilevòng lặp hoặc những thứ khác.


đặc trưng

  • đệ quy xem một thư mục
  • có thể chạy ở nền trước hoặc nền dưới dạng daemon
  • xách tay. Tôi có nó trong Ubuntu cũng như máy chủ CentOS7
  • báo cáo tên tập tin
  • regex để hỗ trợ khớp tập tin
  • xem mulit-file (xem nhiều hơn sau đó chỉ một loại tệp)
  • đồng bộ hóa thực thi lệnh (nếu chúng ta có nhiều người theo dõi)
  • xử lý nhật ký hệ thống (đăng nhập vào syslog nếu chúng ta muốn)
  • CLI và thiết kế tập tin cấu hình dễ dàng và tốt để làm việc với

Được phát triển bởi Sergey Poznyakoff .


Cài đặt

sudo apt install direvent

Nhưng việc cài đặt nó bằng mã nguồn của nó khá dễ dàng và đơn giản, nó cung cấp cho bạn phiên bản cuối cùng (ngay bây giờ là: 5.1).


-3

Vâng tôi khuyên bạn nên như sau.

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

1
OP chỉ muốn chạy lệnh khi sửa đổi được thực hiện ..
heemayl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.