Bash
如何遍歷 STDIN 中的行並執行 shell 命令?
我想在從 STDIN 獲取的每一行上執行一個 shell 命令。
在這種情況下,我想執行
xargs mv
. 例如,給定兩行:mfoo foo mbar bar
我想跑:
xargs mv mfoo foo xargs mv mbar bar
我用
ruby
,awk
和嘗試了以下策略xargs
。但是,我做錯了:只是
xargs
:$ echo "mbar bar\nmbaz baz" | xargs mv usage: mv [-f | -i | -n] [-v] source target mv [-f | -i | -n] [-v] source ... directory
通過
awk
:$ echo "mbar bar\nmbaz baz" | awk '{ system("xargs $0") }'
通過
ruby
:$ echo "mbar bar\nmbaz baz" | ruby -ne '`xargs mv`' $ ls cat foo mbar mbaz
我有一些疑問:
- 我該如何做我想做的事?
- 我的每次嘗試有什麼問題?
- 有沒有更好的方法來“思考”我正在嘗試做的事情?
我特別困惑的是我的
xargs
嘗試不起作用,因為以下工作:$ echo "foo\nbar" | xargs touch $ ls bar foo
echo "mbar bar\nmbaz baz" | xargs mv
xargs
您應該使用該選項-t
來查看發生了什麼。因此,在上述情況下,如果我們要呼叫xargs
with-t
,我們會看到什麼:
mv mbar bar mbaz baz
所以顯然這是不正確的。發生的事情
xargs
就像一條飢餓的鱷魚一樣,吃掉了通過管道餵給它的所有argsecho
。所以你需要一種方法來限制對鱷魚的參數發布。而且由於您是按行請求的,因此您需要的是-l
或-L
for POSIX 選項。echo "mbar bar\nmbaz baz" | xargs -l -t mv
POSIX 方式:
echo "mbar bar\nmbaz baz" | xargs -L 1 -t mv mv mbar bar mv mbaz baz
這就是你想要的。高溫高壓