「一気に最後まで読んだ」本、教えて下さい!

最近シェルスクリプトを勉強し始めました。
が、いきなり躓いています。
諸先輩方に教えていただきたいと思います。
カレントディレクトリにPC1 PC2 PC3 ・・・・PC100
という名前の100個のディレクトリがあります。
この100個のディレクトリの中にそれぞれPC1.txt PC2.txt PC3.txt・・・PC100.txtが入っています。つまりPC1ディレクトリの中にはPC1.txtが入っていて、PC2ディレクトリの中にはPC2.txtが、PC3ディレクトリの中にはPC3.txtが、、、というあんばいです。

カレントディレクトリにnewというディレクトリを作成して、その中にPC1.txt PC2.txt・・・PC100.txtをコピーしたいのですが、どのようにしたらよいでしょうか。

繰り返し処理をすればよいのでしょうか・・・。
初心者にも分かるようにご教示いただけますとありがたいです。よろしくお願いいたします。

A 回答 (3件)

#!/bin/sh


for s in PC*
do
cp $s/$s.txt コピー先
done

実用的には安全のために、
コピー元が正しいかのチェックを
組み込む必要があるでしょう。
    • good
    • 2

mkdir new


cp PC1/PC1.txt new
cp PC2/PC2.txt new
cp PC3/PC3.txt new
(略)
cp PC98/PC98.txt new
cp PC99/PC99.txt new
cp PC100/PC100.txt new


全部そのまま書けば、ループは不要です。
これなら初心者でも分かるでしょ?



100個手で打つのが面倒なら、上のスクリプトを出力するプログラムを、自分の知ってる言語で作ればいいのです。
Perlの例)
perl -E 'say "mkdir new";for($i=1;$i<=100;$i++) { printf("cp PC%d/PC%d.txt new\n",$i,$i);}'
これをそのままshにパイプラインで送れば、シェルスクリプトのファイルは不要です
perl -E 'say "mkdir new";for($i=1;$i<=100;$i++) { printf("cp PC%d/PC%d.txt new\n",$i,$i);}' |


他にも、
ls や find でファイル一覧を作成 → sed で処理して、 上記cp〜 に置き換え → sh で実行
というやりかたもあります。
    • good
    • 1

こんな感じ?



--------------
#!/usr/bin/env bash

mkdir new
cp PC*/PC*.txt new/
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!