WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:下層フォルダを一括リネーム

0:[投稿] atusi [2002/10/30 22:05 ][環境:WIN+IE UNIX系+Perl]

下層フォルダに
index.html というファイル名があれば index.htm

というファイル名にリネームしたいのですが、
下のようなログを見つけました。

http://www.parkcity.ne.jp/~chaichan/qanda/qa2933.htm?02-07-16-22-11

同じ事をシェルスクリプトで書くとすれば、
どのようにかけるのでしょうか?

どなたかご存知の方がいらっしゃれば、
ご教授お願いします。


1:[回答] J [2002/10/31 14:50 ]

ちわ
------------------------
#!/bin/sh

ECHO="/bin/echo"
FIND="/bin/find"
EXPR="/bin/expr"
MV="/bin/mv"

OLD_SUFFIX="html"
NEW_SUFFIX="htm"

if [ "$#" -ne "1" ]
then
       $ECHO "Usage : rename.sh directory"
       exit 2
fi

DIR=$1

for file in `$FIND $DIR -name "*.$OLD_SUFFIX" -print`
do
   res=`$EXPR $file : "\(.*\).$OLD_SUFFIX"`
   $MV $file $res.$NEW_SUFFIX
done

exit 0
---------------------------
こんな感じかな?
ちなみに出来る保証はないんで・・・


2:[回答] JTR [2002/11/01 10:33 ]

res=`$EXPR $file : "\(.*\).$OLD_SUFFIX"`
の解説希望。

勉強がてらに、JさんのBシェルをCシェルに置き換えてみました。

#!/bin/csh

set FIND="/usr/bin/find"
set EXPR="/sbin/expr"
set MV="/sbin/mv"

set OLD_SUFFIX="html"
set NEW_SUFFIX="htm"

if($#argv != 1) then
      echo "Usage : rename.sh directory"
      exit 2
endif

set DIR=$1

foreach file (`$FIND $DIR -name "*.$OLD_SUFFIX" -print`)
  set res=`$EXPR $file : "\(.*\).$OLD_SUFFIX"`
  $MV $file $res.$NEW_SUFFIX
end

exit 0


3:[回答] ひじ [2002/11/01 12:51 ]

>>2
なぜCSHに直すのですか。
http://www.klab.ee.utsunomiya-u.ac.jp/~hiroki/csh-whynot.euc


4:[回答] J [2002/11/01 13:13 ]

>res=`$EXPR $file : "\(.*\).$OLD_SUFFIX"` の解説希望。
ですが
exprのmanにも書いてあるとおり

”国際化された基本正規表現のサブエクスプレッション [\(...\)] が含まれる場合、マッチング演算子は\1 に対応する文字列を返します。”

ってことなんで、〜.$OLD_SUFFIXの文字列の〜の部分を
取得するために使いました。
こんな説明でいいでしょうか?


5:[回答] JTR [2002/11/01 15:21 ]

>>4
:演算子がよくわからなかったのですが。
Jさんの説明と以下のページで理解できました。

http://www.linux.or.jp/JM/html/GNU_sh-utils/man1/expr.1.html

>>3
了解。
BシェルもCシェルもあまり使わないのでアレですが...。
これからは、Bシェルで行きたいと思います。


6:[完了] atusi [2002/11/01 23:37 ]

すごくご丁寧な解答を下さって、本当にありがとうございます。
大切に勉強させて頂こうと思っております。

ありがとうございました。


7:[質問] atusi [2002/11/02 10:39 ]

>>02
Jさま。ありがとうございます。
付随して質問させて頂きます。


@各種コマンドは、$ECHO ではなく echo と直接書いても駄目ですか?

A各種コマンドのパスを findコマンドを使って調べてみたのですが、
ECHO="/bin/echo"
FIND="/usr/bin/find"
EXPR="/usr/bin/expr"

上記のように /bin ディレクトリにあるものから /usr/bin ディレクトリにあるものまで、とバラツキがありました。
これらのコマンドは、何故ディレクトリが統一されていないのでしょうか?

初歩的な質問かも知れませんが、どうぞご教授のほどよろしくお願いします。


8:[回答] \n [2002/11/02 18:05 ]

>$ECHO ではなく echo と直接書いても駄目ですか?
ちゃんと理由があります。(後述)
もちろん実際のパスを直接書いても問題なく動きますが。。。

>何故ディレクトリが統一されていないのでしょうか?
OSによってもそれぞれのコマンドのパスは違います。

基本的に /bin/ にあるものはシステムが使う事もあるコマンド群。
/usr/bin/ にあるものは、文字通りユーザーが使用するもの。
と、一応意味はあるのですが、実際には結構バラバラだったりします。

なので、最初にまとめて定義する方法を採っておけば、OSの変更や他の
システムへの移行時に「変更箇所が集中している為管理が楽」というのが
大きな理由です。

長くプログラミングをしている人なら、自分なりもしくは先人から
受け継いだ一定のコーディングルールを持っていることが多いと思います。
他人の書いたソースには学ぶべき点が沢山有りますよぉ


9:[完了] atusi [2002/11/03 09:53 ]

なるほど、そういうことだったのですね。
本当に勉強になりました。

ありがとうございました。
たくさん拝見させて頂いて、たくさん学ばせて頂きます。


回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World