direvent

direvent

我有一個包含一堆子資料夾的資料夾,這些資料夾已asciidoctor格式化為帶有.adoc副檔名的檔案。

每次我對文件進行更改(經常)時,我都需要運行

asciidoctor -q filename.adoc

將其編譯為 HTML 格式。

我正在嘗試使該過程自動化。到目前為止我已經使用了這個進入

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

但僅適用於現有資料夾,不適用於子資料夾。我嘗試過這種變體,但它不起作用:

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

我有什麼想法可以為所有子資料夾實現這個自動化過程嗎?

答案1

Linux 提供了一個很好的介面來監視所有檔案系統事件,例如建立、修改、刪除檔案。該介面是inotify一系列系統調用,利用這些調用的用戶空間實用程式由 Ubuntu 中的軟體包提供inotify-tools(可在 Universe 儲存庫中找到)。如果您還沒有,請透過以下方式安裝:

sudo apt-get install inotify-tools

inotify-tools提供inotifywaitinotifywatch二進位文件,我們需要第一個。


因此,您希望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事件感興趣,即當文件被修改時。其他可能的值包括等openclose

  • --format %w,我們只需要修改的文件名而不是一堆其他信息,因為我們將使用文件名作為另一個命令的輸入

  • /foo/bar/*.adoc將擴展到目錄.adoc下的所有文件/foo/bar


現在,每當修改任何檔案名稱時,上面都會顯示檔案名,現在對檔案名稱執行命令(假設該命令透過 STDIN 取得參數):

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc | while read -r file ; do
    asciidoctor -q "$file"
done

您也可以在目錄上設定遞歸監視,然後您將需要使用它grep來僅過濾所需的檔案。這裡-r在目錄上遞歸地設定監視 ( )/foo/bar並用於grep僅過濾.adoc檔案:

inotifywait -qrm --event modify --format '%w%f' /foo/bar | grep '\.adoc$' | while read -r file ; do
    asciidoctor -q "$file"
done

當查看目錄時,輸出格式說明%w符解析為目錄名,因此我們需要%f取得檔案名稱。在觀看文件時,%f將解析為空字串。

請注意,您也可以inotifywait在守護程序 ( -d) 模式下運行,您還可以編寫整個過程的腳本,和/或在背景運行,和/或使用更多其他選項。

asciidoctor此外,如果需要,您可以替換為您選擇的任何其他命令。

檢查man inotifywait以獲得更多想法。

答案2

有很多工具,特別是如果您搜尋儲存庫

apt-cache search monitor | grep file

這給了我們很多工具。但你不必測試它們,因為我就是這樣做的。

我已經測試了這些工具和許多其他工具:(inotifywait來自inotify-tools),fswatch, filewatch,swatch, fileschanged, 和entr

在這些工具中,我發現其中三個有用且可靠:

而從這三者中,direvent毫無疑問是最好的。

direvent

它是如此有用和可靠,以至於我用它來進行簡單的操作管道與我擁有的微服務。

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循環或其他東西。


特徵

  • 遞歸地查看目錄
  • 可以運行在前景或者背景作為守護程式
  • 便攜的。我在Ubuntu和CentOS7伺服器上都有它
  • 檔案名稱 報告
  • 正規表示式支援文件匹配
  • 多文件觀看(觀看多個文件而不僅僅是一種類型的文件)
  • 同步命令執行(如果我們有多個觀察者)
  • 系統日誌處理(如果需要,可以記錄到系統日誌)
  • 簡單且良好的 CLI 和設定檔設計可供使用

由開發謝爾蓋·波茲尼亞科夫


安裝中

sudo apt install direvent

但是使用其原始程式碼安裝它非常簡單明了,這將為您提供最新版本(現在是:5.1)。

答案3

使用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

請注意,有一些選項可以遞歸地監視多個檔案或目錄,還有一些選項可以忽略檔案/路徑。

答案4

好吧,我推薦以下內容。

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

相關內容