Bash
查找具有特定路徑的 XML 文件
我正在處理 XML 文件,每個文件都可能有幾十行。實際上有數百個這樣的文件,遍布一個目錄結構。是的,它是 Magento。
我需要找到包含該
<foo><bar><boom><bang>
元素的文件。可以<boom><bang>
在其他標籤下定義標籤,因此**我需要搜尋完整路徑,**而不僅僅是結束標籤或標籤。每個標籤之間可能有幾十行,它們之間還有其他標籤:<foo> <hello_world> ... 50 lines .... </hello_world> <bar> <giraffe> ... 50 lines .... </giraffe> <boom> <bang>Vital information here</bang> </boom> </bar> </foo>
**搜尋定義的文件的優雅的 *nix 方式是
<foo><bar><boom><bang>
什麼?**我目前正在使用最新的 Debian 衍生髮行版。這是我目前的解決方案,遠非雄辯:
$ grep -rA 100 foo * | grep -A 100 bar | grep -A 100 boom | grep bang | grep -E 'foo|bar|boom|bang'
您可以嘗試
xmlstarlet
檢查sel
路徑i
是否存在,然後輸出f
文件名:find . -name '*.xml' -exec xmlstarlet sel -t -i '/foo/bar/boom/bang' -f -n {} +
使用安裝包
xq
中的 XML 解析器工具,根據 xq 輸出僅在退出狀態為 0 時列印文件名。yq
find -type f -name '*.xml' -exec sh -c ' xq -e '.foo.bar.boom.bang' "$1" >/dev/null ' _ {} \; -print
-e 根據輸出設置退出狀態碼;
從
man jq
有關此選項的更多詳細資訊:-e / –exit-status:
如果最後一個輸出值既不是 false 也不是 null,則將 jq 的退出狀態設置為 0,如果最後一個輸出值是 false 或 null,則設置為 1,如果沒有產生有效結果,則設置為 4。如果有任何使用問題或系統錯誤,jq 通常退出 2,如果有 jq 程序編譯錯誤,則退出 3,或者如果 jq 程序執行,則退出 0。