2010-01-31 57 views
3

我正在編寫一個簡單的程序來運行我係統上各種目錄中的一堆文件。它基本上涉及到打開它們並檢查有效的XML。此程序的其中一個選項是列出不良的xml文件。Xargs的最佳輸出格式

這引出我的問題。用於XARGS的最佳輸出格式是什麼。我認爲把每個條目放在一個換行符上就足夠了,但看起來有點混亂。因爲文件名都有空格。

所以說,我的輸出是:

./dir name 1/file 1.xml 
./dir name 2/file 2.xml 
./dir name 3/file 3.xml 

我嘗試下面的命令,但它一直說「沒有這樣的文件或目錄」。

./myprogram.py --list BADXML | xargs -d '\n' cat 

所以..我要麼誤解了如何使用xargs的或者我需要稍微改變我的程序的輸出格式。我不確定最好用最簡單的路線)。如果我可以避免它,我會討厭必須總是輸入一堆xarg選項。

+0

'touch space \ dir; echo hello> space \ dir/space \ file;回聲「空間目錄/空間文件」| xargs -d'\ n'cat'適用於我 – 2010-01-31 06:37:36

回答

2

man xargs

--null

-0輸入項目是由一個空字符,而不是由 空白終止,報價和 反斜槓不是特殊(每 字符被字面上)。 禁用文件字符串的結尾,其中 被視爲與其他任何參數一樣。 當輸入項目可能包含 空格,引號或 反斜槓時有用。 GNU find -print0 選項產生適合於該模式的輸入 。

+0

這也行不通。嗯,我想我可以null終止我的輸出。如果我沒有使用xargs,那麼這並不是一個非常漂亮的列表。 – PKKid 2010-01-31 06:09:24

+2

爲您的程序添加一個「-0」選項。 './myprogram.py -0 --list BADXML | xargs -0 cat' – 2010-01-31 06:30:03

+0

我越來越近了。我添加了一個-0選項,它將通過python輸出「\ 0」.join(listItems)。我正在運行命令「./myprogram.py -0 --list BADXML | xargs -0 ls -l」。除了報告「沒有這樣的文件或目錄」的最後一個項目之外,一切都有效。如果我將python行改爲「\ 0」.join(listItems)+「\ 0」以獲得最後一項,它適用於最後一個項目,但是我仍然沒有這樣的文件或目錄上的「」(空行)。 – PKKid 2010-01-31 06:53:33

1

你可以溝xargs的,並使用閱讀:

 
./myprogram.py --list BADXML | while read -a line; do cat "${line[*]}"; done 

xargs的任何東西可以做,而閱讀的循環可以做的更好......

後記按我When should xargs be preferred over while-read-loops問題,答案強調了xargs的一個非常強大的效率情況,儘管用一些額外的腳本來模擬xargs的論點並不困難,例如

batch10cat() { 
    local i=1 argv line 
    declare -a argv 
    while read -r line; do 
     argv[i]="$line" 
     let i++ 
     if test $i -gt 10; then i=1; cat "${argv[@]}"; fi 
    done 
    if test $i -gt 1; then cat "${argv[@]}"; fi 
} 
./myprogram.py --list BADXML | batch10 cat 
0

隨着GNU並行http://www.gnu.org/software/parallel/你應該能夠無需更改做它myprogram.py:

./myprogram.py --list BADXML | parallel cat 

額外的獎勵:貓會並行運行,因此可能在多核計算機更快。