STDINから取得した各行に対してシェルコマンドを実行したいと思います。
この場合はxargs mv
。たとえば、次の2行が与えられます。
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
ベストアンサー1
echo "mbar bar\nmbaz baz" | xargs mv
何が起こっているかを確認するには、xargs
このオプションを使用する必要があります。-t
したがって、上記の場合に を使用して呼び出すと、次のxargs
よう-t
な内容が表示されます。
mv mbar bar mbaz baz
したがって、これは明らかに正しくありません。空腹のワニのように、パイプを介してxargs
供給されるすべてのパラメータを食べますecho
。したがって、crocのパラメータリリースを制限する方法が必要です。行ごとに要求するため、-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
これがあなたが望むものです。ファタイ