gooドクター有料プランが1ヶ月間無料!

同じディレクトリにある

test-sum.txt
test-average.txt
test-deviation.txt
...

というファイルの名前を

my-sum.dat
my-average.dat
my-deviation.dat
...

と一括変更したいのですが、bash で可能でしょうか?
よろしくお願いします!!

ワイルドカード * の扱いが Windows のコマンドプロンプトと違うみたいで、とまどっています。。

gooドクター

A 回答 (5件)

sed版も再帰dirに対応



find . -name '*.txt' -print |
sed -ne 's/\([^/]*\)\/test-\([^.]*\)\.txt/mv \1\/test-\2.txt \1\/my-\2.dat/p' | sh
    • good
    • 1
この回答へのお礼

ありがとうございます!

お礼日時:2005/12/27 14:35

windows の場合、* は各コマンドが個別に独自の意味を持って処理しますが、unixのshellの場合は、各コマンドを起動する前にshellが展開します。


shellでワイルドカードを使う場合は、まず実際のコマンドでなく、echo コマンドを使うと、実際に実行されるコマンドラインがわかるでしょう。
例:echo mv test-*.txt my-*.txt

本題ですが、bashの場合、sedやawkを使わないでも出来ます。

for F in test-*.txt;do mv $F ${F/test-/my-};done
    • good
    • 0
この回答へのお礼

へえ、そういうことができたのですね。ありがとうございます!

お礼日時:2005/12/27 14:34

済みません間違えました。



find . -name '*.txt' -print |
sed -ne 's/.\/test-\([^.]*\)\.txt/mv test-\1.txt my-\1.dat/p' | sh
    • good
    • 1

find . -name '*.txt' -print |


sed -ne 's/test-\([^.]*\)\.txt/mv test-\1.txt my-\1.dat/p' | sh
    • good
    • 0

find . -name '*.txt' -print |


awk '
{
dist = $0;
sub("test-","my-",dist);
sub("txt","dat",dist);

printf ("mv %s %s\n", $0, dist);
}' | sh
    • good
    • 0

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

gooドクター

このカテゴリの人気Q&Aランキング