
我有一個包含一堆子資料夾的資料夾,這些資料夾已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
提供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 | 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