2

次のサブディレクトリがあるとしましょう

./a/, ./b/, ./c/, ... 

つまり、現在の作業ディレクトリにはこれらのサブディレクトリa/b/ありc/、これらのサブディレクトリにはそれぞれファイルがあります。ディレクトリ内a/はファイルa.in、ディレクトリ内b/はファイルb.inなどです。

ここで、各.inファイルを.outファイル、つまりa.intoa.outおよびb.intob.outにコピーし、コピー元のディレクトリに配置する必要があります。したがってa.out、ディレクトリにありa/ます。

など、さまざまなアプローチを試しました。

find ./ -name '*.in'|cp * *.out

*.outディレクトリであると考えているため、これは機能しません。また試した

ls -d */ | cd; cp *.in *.out

しかし、それはサブディレクトリをリストし、それらのそれぞれに行きますが、それを機能させcpません(それでも機能しません)

find ./ -name '*.in'

コマンドは正常に動作します。引数を代入演算子にパイプする方法はありますか? 例えば

find ./ -name '*.in'| assign filename=|cp filename filename.out

filenameにassign filename=は、各ファイルの値を指定し.inます。.in実際、割り当てがファイル拡張子を取り除くことができれば、さらに良いa.in.outでしょう。a.out

お時間をいただきありがとうございます。

4

3 に答える 3

4

シェルに助けてもらいましょう:

find . -name '*.in' | while read old; do
    new=${old%.in}.out # strips the .in and adds .out
    cp "$old" "$new"
done

あなたが言ったfindコマンドを使用して、bashに出力を一度に1つのファイル名で読み取らせました。そのため、bash while ループは一度に 1 つずつファイル名を取得し、少し置換してそのままコピーします。素晴らしく簡単です(ただし、テストされていません!)。

于 2011-07-07T02:25:59.423 に答える
1

for ループを試してください:

for f in */*.in; do
    cp $f ${f%.in}.out;
done

グロブは、拡張子が .in のすべてのファイルを 1 ディレクトリ下にキャッチする必要があります。cp コマンドでは、.in サフィックスを取り除き、.out を追加します (文字列演算子を使用した Bash での変数マングリングを参照) 。

または、(1 レベルの深さだけでなく) すべてのサブディレクトリに再帰する場合は、グロブを検索に置き換えます。

for f in $(find . -name '*.in'); do
    cp $f ${f%.in}.out;
done
于 2011-07-07T02:29:21.337 に答える
0

これでうまくいくはずです!

for f in `find . -type f -name "*.in"`; do cp $f `echo $f | sed 's/in$/out/g'`; done
于 2011-07-07T02:33:54.297 に答える