• ベストアンサー

ファイル名の一括変換(linux)

01.abc_def.txt 02.ghij_klm.txtを 01_abc_def.txt 02_ghij_klm.txtのように 連番のすぐ後の[.]を[_]にディレクトリ単位で一括変換したいのですが、どなたか御教授ください。

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

  • ベストアンサー
  • you-m
  • ベストアンサー率58% (190/327)
回答No.4

実は2つとも同じ本です。 よく見ると、作者も訳者も同じ人物で、タイトルも微妙に違うように見えて、単に訳し方が違うだけです。 前者が後者の第2版なので、前者を買うことをお勧めします。 ちなみに、私は2冊とも持っています(爆) この本は、シェルスクリプトを学ぶに当たって、必要なことは一通り網羅されています。 一通りシェルスクリプトの基本的な考え方や、より汎用的にするための方法論がわかりやすくかかれており、99年に初版を買ってから、3桁以上のスクリプトを書いた今でもよくこの本に立ち返ることがあります。 Webなどに出ている情報はある意味リファレンス的なものが多いのと、OSを問わず通用することを意識しているサイトはほぼ皆無なため、私が人に勧めるのは、必ずこの本です。

ABS
質問者

お礼

 この本にはそんな秘密があったのですか...  早速、文献をAmazonにオーダーしました。  度重なる質問に対する解答、誠に感謝いたします!

その他の回答 (3)

  • ara_ara
  • ベストアンサー率35% (124/348)
回答No.3
ABS
質問者

お礼

 立ちますねビンビン、二つとも未発掘のサイトでした。貴重な情報ありがとうございます。

  • you-m
  • ベストアンサー率58% (190/327)
回答No.2

シェルスクリプトに限りませんが、初心者が1から勉強するのに向いたプログラミング言語のWebサイトは、多くありません。 特にシェルスクリプトの場合、Webの情報量も多くありませんね。 個人的に、シェルスクリプトの勉強がしたいのなら、この本がお勧めです。 入門UNIXシェルプログラミング SOFTBANK 入門と銘打ってはいますが、これ一冊でシェルスクリプトの勉強は充分といえます。 ざっと下のスクリプトの説明をします。 大枠で2つのループから形成されています。 外側のループは、lsの出力結果一つ一つをDIRという変数に入れています。 次のif文で、それがディレクトリかどうかを調べて、ディレクトリで無い場合は、何もしません。 ディレクトリで会った場合は、そのディレクトリにcdして2番目のループ処理に入ります。 ここでは、特定のパターンを持ったファイル名のリストを抽出し、それら一つ一つをまずSRCFILEという変数に取り出します。 次に、SRCFILEに入ってきたファイル名を、sedを使って直したいファイル名に変更したものを、DSTFILEという変数に格納します。 生成されたファイル名を使って、mvします。

ABS
質問者

お礼

 丁寧な説明、大変ありがとうございます。 >特にシェルスクリプトの場合、Webの情報量も多くありませんね。  やはりそうですか、自分もいろいろとwebをうろちょろしましたがなかなか見つけれずにいました。  がっちり勉強したいので、you-mさんのおすすめ参考文献の購入を考え本を調べてみましたが、似たようなタイトルの本が複数ありましたので、どちらであるか確認を取りたい次第であります。 こちらでしょうか? 出版社名 ソフトバンクパブリッシング 書籍名 入門UNIXシェルプログラミング シェルの基礎から学ぶUNIXの世界 著者名 ブルース・ブリン/著 山下哲典/訳 出版年月  2003年2月 ページ数・版型  434P 24cm ISBNコード 4-7973-2194-6 価格 3,200円 (税別) それとも 詳細 出版社名 ソフトバンク 書籍名 入門UNIXシェルプログラミング Bourne Shellの基礎から学ぶUNIX World 著者名 Bruce Blinn/著 山下哲典/訳 出版年月  1999年3月 ページ数・版型  430P 24cm ISBNコード 4-7973-0828-1 価格 3,200円 (税別) こちらでしょうか?  

  • you-m
  • ベストアンサー率58% (190/327)
回答No.1

厳密に動作確認はしてませんが、おおよそこのようなシェルを書けば、要件はみたせるかと。 ここへ書き込むと、インデントが外れてしまうので、適当に整形してください。 #!/bin/sh for DIR in `ls` do if [ ! -d ${DIR} ]; then continue fi cd ${DIR} for SRCFILE in `ls [0-9][0-9]*.txt` do DSTFILE=`echo ${SRCFILE} | sed -e 's/^\([0-9][0-9]*\)\./\1_/'` mv ${SRCFILE} ${DSTFILE} done cd .. done

ABS
質問者

お礼

ばっちり動きました! ありがとうございます。  ただ、自分はlinux初心者なので解答欄の文の意味がチンプンカンプンであります。  ’ここを読むと勉強になるよ’ってURLがあれば、御教授よろしくお願いいたします。

関連するQ&A