2013-12-13 27 views
2

我試圖寫一個腳本,將通過看目錄,發現所有的XML文件,過xmllint運行它們,並格式化的結果保存到一個文件在名爲formatted的子目錄中具有相同名稱。這是我到目前爲止的腳本:格式目錄中的所有XML文件並將其保存在一個子目錄

find . -maxdepth 1 -type f -iname "*.xml" | xargs -I '{}' xmllint --format '{}' > formatted/'{}' 

這在某種程度上起作用。該子目錄最後有一個文件,名爲"{}",它只是通過xmllint處理的最終文件的結果。我怎樣才能讓文件正確寫入子目錄?

回答

5

您看到的文件名爲{}可能應該包含全部的格式化文件在一起。原因是您使用的重定向實際上並不是xargs所看到的命令的一部分。重定向是由shell來解釋,所以它的作用是運行

find . -maxdepth 1 -type f -iname "*.xml" | xargs -I '{}' xmllint --format '{}' 

並將輸出保存到名爲formatted/{}文件。

嘗試使用的xmllint,而不是重定向--output選項:

... | xargs -I '{}' xmllint --format '{}' --output formatted/'{}' 

您還可以避免使用-exec選項find調用xargs

find . -maxdepth 1 -type f -iname "*.xml" -exec xmllint --format '{}' --output formatted/'{}' \; 
+0

謝謝,不知道xmllint的'--output'選項。我測試了這兩種解決方案(使用'xargs'和'-exec'),它們都可以很好地工作。有趣的是,'find'手冊頁提到,「當你使用'-exec'時,命令中只允許有一個'{}'''的實例,這就是我原來選擇'xargs'的原因,但它工作正常正好。 – Ben

+0

@Ben在我手冊頁的這個版本中,這個短語是用於'-exec command {} +'語法的,但是這裏使用了'-exec command;'語法,這在手冊頁中有多行描述。 –

相關問題