20150131a複数ファイルを一気に変更する方法と、年号が自動で変更されるようにする記述方法を覚え書き。

沢田内科医院HPの各ページ(HTMLファイル)下部に表示している
copyright 2012-2014 sawada-naikaiin.

copyright 2012-2015 sawada-naikaiin.
に年号更新。

一つ一つファイルを開いて編集するのは面倒だし、Ubuntuを使っているのに、いつまでも互換環境での秀丸エディタの「grepして置換」に頼っているのでは、あまりに情けないので、端末からシェルスクリプトを実行してHTMLファイルを修正する方法を覚えようかなと・・・。

まずは、端末(ターミナルソフト)を起動し、対象ディレクトリに移動後、該当ファイル(”2012-“を含むHTMLファイル)がいくつ存在するのか確認します。

$ find ./ -type f -iregex ".*\.html$" -print | xargs grep "2012-"

端末で上記コマンドを実行。
findコマンドで、現在の場所(./)以下のサブディレクトリに存在する、通常ファイル(-type f)で、ファイル名の最後が.htmlのファイル(-iregex “.*\.html$”)を検索し、内容を出力(-print)し、パイプ(|)で次のxargsコマンドへ。xargsは標準入力からの引数(HTMLの内容)をgrepコマンドに渡し、grepコマンドは引数(”2012-“)に合致した行を標準出力(画面)に表示します。

画面がサーと流れて、どれくらいの件数があるのかわからないので、更にパイプ(|)し、wcコマンドで行数(-l)をカウントしてみます。

$ find ./ -type f -iregex ".*\.html$" -print | xargs grep "2012-" | wc -l
614
$

全部で614ファイルの変更が必要な様です。

シェルスクリプトを作成してみます。

$ sudo nano copyright.sh

まずは、配列にディレクトリとファイル名が格納できるかテスト。

#!/bin/bash

_FILES=$(find ./ -type f -iregex ".*\.html$")

for file in ${_FILES}
do
  echo $file
done
exit 0

ファイルを保存(Ctrl+O、Enter)し、エディタを終了(Ctrl+X)し、シェルスクリプトを実行。

$ sh copyright.sh

該当ディレクトリ及びファイル名が画面上にサーと表示されたらOK。
「| wc -l 」を追加し件数を確認することも可能ですが、copyright表示なしのHTMLも含まれます。

次に、テストの記述(echo・・・)は削除し、sedコマンドによる置換を記述します。

$ sudo nano copyright.sh

最近、端末でのエディタは、viでなく、nanoを使用中。

#!/bin/bash

_FILES=$(find ./ -type f -iregex ".*\.html$")

for file in ${_FILES}
do
 sed 's/2012-2014/2012-2015/g' $file > ${file}.new
 mv -f $file ${file}.bak
 mv -f ${file}.new $file
done
exit 0

保存したら再度実行。数秒でコマンドプロンプトに戻ります。

$ sh copyright.sh

実行後、以下のコマンドで書き換えられていることを確認します。

$ find ./ -type f -iregex ".*\.html$" -print | xargs grep "2-2015"
$ find ./ -type f -iregex ".*\.html$" -print | xargs grep "2-2015" | wc -l
614
$

これで、614個の書き換えが終わりました。
後は、FTPでアップロードするだけです。

とは言え、毎年こんな作業をするのも能が無いので、2015の部分を、時計を参照し、年が変われば自動で表示も変わるように変更してみましょう。

下記サイトを参考にさせて頂きました。ありがとうございます。
Design Plus | コピーライトの年号を自動表示する方法

PHPで実現する場合は、

copyright 2012-2015 sawada-naikaiin.

copyright 2012-
<?php echo date(‘Y’);?>
sawada-naikaiin.

に変更すれば良いようです。
・・・でも、ファイル名を.htmlから.phpに変更する必要があるので今からは無理。
・・・リンク書き換えの手間や、検索サイト経由のアクセスを考えると今から変えるのはNG。

なので、今回は、JavaScriptで年を表示させます。

copyright 2012-2015 sawada-naikaiin.

copyright 2012-
<script type=”text/javascript”>
myDate = new Date() ;myYear = myDate.getFullYear ();document.write(myYear);
</script>
sawada-naikaiin.

に変更すれば良いようです。
JavaScriptは閲覧端末の時計参照ですが、年号だけなので問題ないでしょう。

 
先のスクリプトをコピーして修正します。

$ cp copyright.sh cr.sh
$ sudo nano cr.sh
#!/bin/bash

_FILES=$(find ./ -type f -iregex ".*\.html$")

for file in ${_FILES}
do
 sed 's/2012-2015/2012-<script type="text\/javascript">myDate = new Date() ;myYear = myDate.getFullYear ();document.write(myYear);<\/script>/g' $file > ${file}.new
 mv -f $file ${file}.bak
 mv -f ${file}.new $file
done
exit 0

sedコマンドの ‘s/変換前文字列/変換後文字列/g’ 記述部分で注意が必要。
置換後文字列の中で「/」を記述する場合は、「/」の一つ前に「\」(バックスラッシュ)を入れエスケープする必要があります。上記例では2箇所。

保存後、実行し、正しく変換されていることを確認します。

$ sh cr.sh
$ find ./ -type f -iregex ".*\.html$" -print | xargs grep "2012-<"
$ find ./ -type f -iregex ".*\.html$" -print | xargs grep "2012-<" | wc -l
614
$

20150131bサーバーにアップロードしブラウザで表示を確認します。

その後、わざとPCの時計(年)を進めてみます。

ページを再読み込みして、進めた年が表示に反映されればOKです。

(確認後、PCの時計を元に戻すべし。)


ちなみに、スクリプトが残した「*.html.bak」ファイルを、コマンドで削除したい場合は、以下の3行目を実行します。
1行目は該当ディレクトリとファイル名を表示。2行目は件数表示。

$ find ./ -type f -iregex ".*\.html.bak$"
$ find ./ -type f -iregex ".*\.html.bak$" | wc -l
$ find ./ -type f -iregex ".*\.html.bak$" -exec rm -f {} \;

まあ、ファイラ(Nautilus)で「.html.bak」を検索して削除してもいいんですが・・・覚え書きです。

関連記事
2013年12月16日 本日の日付と曜日(改)
2013年10月9日 「いいね!」ボタンの追加をスクリプトで簡略化