最近,我經常發現自己想在具有幾行輸出另一個命令的輸出運行一些命令。通過行循環的Shell命令?
例如,假設我有一個返回上一個新行多項每個文件路徑的命令,我想刪除所有這些文件。
是否有一個命令,可以幫助我做到這一點?
最近,我經常發現自己想在具有幾行輸出另一個命令的輸出運行一些命令。通過行循環的Shell命令?
例如,假設我有一個返回上一個新行多項每個文件路徑的命令,我想刪除所有這些文件。
是否有一個命令,可以幫助我做到這一點?
這聽起來像你正在尋找xargs
。從手冊頁:
xargs的讀取從標準輸入參數,用空格或換行符(可以用雙引號或單引號或反斜槓被保護)界定,並執行該命令(默認爲/斌/回聲)一次或多次使用任何初始參數,然後從標準輸入中讀取參數。
所以你可以做這樣的事情:
ls | grep -v '*.cpp' | xargs rm
上面的命令將刪除當前目錄中的一切,除了*.cpp
文件。
在bash類似的炮彈,你可以這樣做:
rm `your command`
或
rm $(your command)
這個效果很好,直到文件名包含空格,或者列表增長太長。 – 2009-07-01 00:52:06
在Windows中,CMD:
for /f "usebackq delims=" %i in (`your command`) @del "%i"
PowerShell的:
your command | Remove-Item
嘗試
cat file | while read i; do echo "working on line $i"; done
雖然你可以與具有空間線的麻煩。我從來不記得如何解決這個問題。 請注意,一行一行地基礎上每操控這個命令的作品。使用xargs只適用於你問的例子(和類似的例子),但是如果你能用xargs解決你的問題,那肯定會去做。
你正在尋找切割。這將打印第一列。如果你想更有趣,請查看sed和/或awk。 http://www.manpagez.com/man/1/cut/ cat file |同時閱讀我;做FOO = echo $ i |削減-f1; echo $ FOO;完成 (編輯:從答覆轉移到評論) – John 2009-07-02 02:43:55
ls | xargs rm
一個有趣的應用(搜索目錄的短語在文件中)
find /path/to/dir | xargs grep "search text"
,一個是沒有關係的,但它顯示xargs的是如何工作的
假設一個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可以讓你立即獲得所有的參數。
什麼環境?視窗? UNIX? – Joey 2009-07-01 00:33:33