複数ファイルを一気に変更する方法と、年号が自動で変更されるようにする記述方法を覚え書き。
沢田内科医院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 $
その後、わざと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日 「いいね!」ボタンの追加をスクリプトで簡略化