• ベストアンサー

シェルスクリプトでファイル名変更

あるディレクトリにあるファイルの名前をシェルスクリプトで一括変更したいと思っています。 旧ファイル名 新ファイル名 apple   banana orange   lemon kiwi      melon strawberry apricot のように、新旧ファイル名(拡張子を除く)をタブで区切ってfilename.txtというファイルに入れてあります。ごらんの通り新旧ファイル名とも規則的ではありません。拡張子は新旧ともすべて.wavです。 awkもしくはreadでできるかなと思ったのですが、私の力ではできませんでした。お知恵を拝借できれば幸いです。(シェル初心者、使っているのはBシェルです)

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

こんな感じ? #!/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 の行を調整するなどしてください。

juillet_07
質問者

お礼

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

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

このファイルから例えば mv apple.wav banana.wav のような行を出力するように awk で処理して sh にパイプで食わせるってのもありだと思います.

juillet_07
質問者

お礼

awk '{print "mv "$2".wav "$1".wav"}' filename.txt | sh ってことですね!1行でできてしまうんですねー。 理論的にはわかっていたのですが、「shにパイプで食わせる」という基本的な方法を知らず、前に進めずにいました。でもご指摘いただいて調べた結果、できるようになりました。勉強になりました。ありがとうございます。