重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

あるディレクトリにあるファイルの名前をシェルスクリプトで一括変更したいと思っています。

旧ファイル名 新ファイル名
apple   banana
orange   lemon
kiwi      melon
strawberry apricot

のように、新旧ファイル名(拡張子を除く)をタブで区切ってfilename.txtというファイルに入れてあります。ごらんの通り新旧ファイル名とも規則的ではありません。拡張子は新旧ともすべて.wavです。

awkもしくはreadでできるかなと思ったのですが、私の力ではできませんでした。お知恵を拝借できれば幸いです。(シェル初心者、使っているのはBシェルです)

A 回答 (2件)

こんな感じ?



#!/bin/sh
source='filename.txt'
if [ "x$1" != "x" ]
then
source=$1
fi

while read from to
do
echo "mv ${from}.wav ${to}.wav"
done < $source

確認のため echo で文字列出力するようにしています。
実際に使うなら echo の行を調整するなどしてください。
    • good
    • 1
この回答へのお礼

できました!ありがとうございました!!

ちなみに
source='filename.txt'
if [ "x$1" != "x" ]
then
source=$1
fi
の部分は、新旧ファイル名を格納してあるファイルを引数として指定できるようにするためですか?つまり、もしコマンド名の後に別のファイル名を引数として指定すれば、そのファイルから新旧ファイル名を読み込む、引数がなければfilename.txtから読み込む、という。

お礼日時:2007/01/19 12:11

このファイルから例えば


mv apple.wav banana.wav
のような行を出力するように awk で処理して sh にパイプで食わせるってのもありだと思います.
    • good
    • 0
この回答へのお礼

awk '{print "mv "$2".wav "$1".wav"}' filename.txt | sh
ってことですね!1行でできてしまうんですねー。

理論的にはわかっていたのですが、「shにパイプで食わせる」という基本的な方法を知らず、前に進めずにいました。でもご指摘いただいて調べた結果、できるようになりました。勉強になりました。ありがとうございます。

お礼日時:2007/01/19 13:08

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