Bash

如何遍歷 STDIN 中的行並執行 shell 命令?

  • April 10, 2017

我想在從 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來查看發生了什麼。因此,在上述情況下,如果我們要呼叫xargswith -t,我們會看到什麼:

mv mbar bar mbaz baz

所以顯然這是不正確的。發生的事情xargs就像一條飢餓的鱷魚一樣,吃掉了通過管道餵給它的所有args echo。所以你需要一種方法來限制對鱷魚的參數發布。而且由於您是按行請求的,因此您需要的是-l-Lfor 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

這就是你想要的。高溫高壓

引用自:https://unix.stackexchange.com/questions/358000