私は走りたいです:
./a.out < x.dat > x.ans
それぞれ*.datディレクトリ内のファイルㅏ。
もちろん、これはbash / python /すべてのスクリプトを介して行うことができますが、私はセクシーな風刺を書くのが好きです。私が達成できるのは(まだstdoutなし)です。
ls A/*.dat | xargs -I file -a file ./a.out
しかし、-ㅏ置換-str 'ファイル'はxargsでは認識されません。
助けてくれてありがとう。
ベストアンサー1
まず、ls
出力をファイルのリストとして使用しないでください。シェル拡張を使用するか、find
潜在的な結果については以下を参照してください。ls+xargs誤用と正しい使用の例xargs
。
1. 簡単な方法:~のためリング
以下のファイルのみを処理するには、A/
単純なfor
ループで十分です。
for file in A/*.dat; do ./a.out < "$file" > "${file%.dat}.ans"; done
2.なぜ pre1でls | xargs
はないのですか?
ls
以下は、withを使用して操作を実行すると、xargs
状況がどれほど悪くなる可能性があるかの例です。次のシナリオを考えてみましょう。
まず、空のファイルを作成しましょう。
$ touch A/mypreciousfile.dat\ with\ junk\ at\ the\ end.dat $ touch A/mypreciousfile.dat $ touch A/mypreciousfile.dat.ans
ファイルを見ると、何も含まれていないことがわかります。
$ ls -1 A/ mypreciousfile.dat mypreciousfile.dat with junk at the end.dat mypreciousfile.dat.ans $ cat A/*
以下を使用して魔法コマンドを実行します
xargs
。$ ls A/*.dat | xargs -I file sh -c "echo TRICKED > file.ans"
結果:
$ cat A/mypreciousfile.dat TRICKED with junk at the end.dat.ans $ cat A/mypreciousfile.dat.ans TRICKED
だからあなたはうまく扱いmypreciousfile.dat
ましたmypreciousfile.dat.ans
。そのファイルに内容がある場合は削除されます。
2.使用法 xargs
:正しい使用法 find
引き続き使用するには(nullで終わる名前)をxargs
使用してください。-0
find A/ -name "*.dat" -type f -print0 | xargs -0 -I file sh -c './a.out < "file" > "file.ans"'
2つの点に注意してください。
- これにより、
.dat.ans
次に終わるファイルを作成できます。 - これ壊れるファイル名に引用符(
"
)が含まれている場合。
2つの問題は、異なるシェル呼び出し方法によって解決できます。
find A/ -name "*.dat" -type f -print0 | xargs -0 -L 1 bash -c './a.out < "$0" > "${0%dat}ans"'
3. すべて完了find ... -exec
find A/ -name "*.dat" -type f -exec sh -c './a.out < "{}" > "{}.ans"' \;
.dat.ans
ファイル名にが含まれていると、ファイルが再生成されます"
。これを行うには、bash
ファイル呼び出し方法を使用して変更します。
find A/ -name "*.dat" -type f -exec bash -c './a.out < "$0" > "${0%dat}ans"' {} \;