STDINで行を繰り返してシェルコマンドを実行するには?

STDINで行を繰り返してシェルコマンドを実行するには?

STDINから取得した各行に対してシェルコマンドを実行したいと思います。

この場合はxargs mv。たとえば、次の2行が与えられます。

mfoo foo
mbar bar

私は走りたいです:

xargs mv mfoo foo
xargs mv mbar bar

私は次の戦略を試しましたrubyawkxargs。しかし、私は何かが間違っています。

のみ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または-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

これがあなたが望むものです。ファタイ

おすすめ記事