2009-07-01 97 views
1

最近,我經常發現自己想在具有幾行輸出另一個命令的輸出運行一些命令。通過行循環的Shell命令?

例如,假設我有一個返回上一個新行多項每個文件路徑的命令,我想刪除所有這些文件。

是否有一個命令,可以幫助我做到這一點?

+1

什麼環境?視窗? UNIX? – Joey 2009-07-01 00:33:33

回答

6

這聽起來像你正在尋找xargs。從手冊頁:

xargs的讀取從標準輸入參數,用空格或換行符(可以用雙引號或單引號或反斜槓被保護)界定,並執行該命令(默認爲/斌/回聲)一次或多次使用任何初始參數,然後從標準輸入中讀取參數。

所以你可以做這樣的事情:

ls | grep -v '*.cpp' | xargs rm 

上面的命令將刪除當前目錄中的一切,除了*.cpp文件。

3

在bash類似的炮彈,你可以這樣做:

rm `your command` 

rm $(your command) 
+1

這個效果很好,直到文件名包含空格,或者列表增長太長。 – 2009-07-01 00:52:06

3

在Windows中,CMD:

for /f "usebackq delims=" %i in (`your command`) @del "%i" 

PowerShell的:

your command | Remove-Item 
0

嘗試

cat file | while read i; do echo "working on line $i"; done 

雖然你可以與具有空間線的麻煩。我從來不記得如何解決這個問題。 請注意,一行一行地基礎上每操控這個命令的作品。使用xargs只適用於你問的例子(和類似的例子),但是如果你能用xargs解決你的問題,那肯定會去做。

+0

你正在尋找切割。這將打印第一列。如果你想更有趣,請查看sed和/或awk。 http://www.manpagez.com/man/1/cut/ cat file |同時閱讀我;做FOO = echo $ i |削減-f1; echo $ FOO;完成 (編輯:從答覆轉移到評論) – John 2009-07-02 02:43:55

1
ls | xargs rm 

一個有趣的應用(搜索目錄的短語在文件中)

find /path/to/dir | xargs grep "search text" 

,一個是沒有關係的,但它顯示xargs的是如何工作的

1

假設一個UNIX的像環境:

要處理空格的名稱,使用-0標誌xargs的。與find:

find . -name '*.mp3' -print0 | xargs -0 dosomething 

一些其它命令具有用於NUL分隔的輸出,通常是-0-z或各種開關。如果你的列表是面向行的,做這樣的事情:

cat filelist | tr -s '\012\015' '\000' | xargs -0 dosomething 

其中採用tr來換行和換行轉換爲完全無效,處理UNIX和DOS(甚至是蘋果經典)行結束,跳過空白行。

不要忘記換行符在大多數類UNIX文件系統上都是有效的文件名字符。

如果dosomething是複雜的,你可以使用bash功能:

dosomething() { 
    while [ -n "$1" ] ; do 
     out="$(basename "$1" .mp3).ogg" 
     convert "$1" "converted/$out" 
     shift 
    done 
} 

export -f dosomething 

並調用xargs,如:

cat filelist | tr -s '\012\015' '\000' | xargs -0 bash -c 'dosomething "[email protected]"' -- 

注意合理使用雙引號保存空間,和雙帶引號的字符串可嵌套在雙引號的$() eval運算符中。

在功能,你可以寫"[email protected]"得到正確引用參數列表傳遞給子:

dosomething() { 
    command1 preargs "[email protected]" postargs | command2 
    command3 "[email protected]" 
} 

您還可以使用read工作線由行:

cat filelist | while read i ; do something "$i" ; done 

但是xargs可以讓你立即獲得所有的參數。