大規模なサイトを管理しているとどうしても古いページがサーバに残ってしまうことがあります。
これらの古いページは、トップページ経由でリンクをたどってアクセスするユーザの目に触れることはありませんが、Googleなど検索エンジンから直接アクセスするユーザが、
サイト管理者の意図せずして、古いページにアクセスしてしまうことがあります。
今回、これらの古いページをまとめて削除する仕事の依頼を頂いたので、基本的作業手順をメモしておきます。
作業環境
- WindowXP+cygwinで作業しています。
- LinuxやMac OS Xでもほとんど同じ手順で作業できます。
- エクセル(MS-Excel)の代わりにOpenOfficeOrg Calcの使用も可です。
まずサイト上にある html ファイルのリストを作成します。 FTPサーバのドキュメントルートが /www/ とすると、lftpを使って以下のようにして サーバ上にあるすべてのファイルリストをディレクトリ情報付きで、取得します。
$ lftp hogehoge.net
lftp> cd /www/
lftp> find ./ > pagelist
これで、ローカルPC上に pagelist ファイルが作成されます。 以下のような感じです。
./index.html
./sitemap.html
./contact/index.html
./menber/index.html
./imgs/top.gif
./imgs/logo.gif
...
lftp で作成したファイルリストは html ページ以外のファイルもリストアップされているので、html で終わる(拡張子が html の)ファイルのみ抽出します。
$ cat pagelist | grep "html$" > pagelist_only_html
pagelist_only_html は、以下のようになっていてそのままではブラウザでページをチェックできません。
./index.html
./sitemap.html
./contact/index.html
./menber/index.html
以下のように http://www.hogehoge.net/ を各行の先頭に追加します。
http://www.hogehoge.net/index.html
http://www.hogehoge.net/sitemap.html
http://www.hogehoge.net/contact/index.html
http://www.hogehoge.net/menber/index.html
一括置き換え
数が多い場合は、たとえば以下のような ex script でまとめて処理できます。
replace.exs %s/^./http://www.hogehoge.net/ wq
$ ex pagelist_only_html < replace.exs
ステップ3で作成した pagelist_only_html を pagelist_only_html.csv にリネームしてエクセルにインポートします。
(※csv拡張子を付ける必要はないですが、説明の便宜上 csv拡張子付きファイルにリネームします。)
ただし、このままURLをエクセル上でクリックしてもブラウザで開いてくれません。 (つまりハイパーリンク扱いになっていない。) csvでインポートしたデータをハイパーリンク扱いにするには、=hyperlink() 関数を使います。
たとえば、
http://www.hogehoge.jp/index.html
をハイパーリンクとしてエクセルで扱うには、
=hyperlink("http://www.hogehoge.jp/index.html")
とした上で、エクセルにインポートします。
一括置き換え
数が多い場合は、たとえば以下のような ex script でまとめて処理できます。
addhyperlink.exs %s/^/=hyperlink("/ %s/$/")/ wq
$ ex pagelist_only_html.csv < addhyperlink.exs
ステップ4までで作成した pagelist_only_html.csv をエクセルにインポートしておくことで、 A列にURLがリストアップされます。 あとは、人間が一件ずつチェックして、削除すべきページは B列に 'd' などの削除マークを入れておきます。
削除対象のファイルが決まったら、lftp で一括削除します。 直接サーバ上のファイルを lftp のスクリプトを使って消すのもありですが、 今回は、いったん mirror -v でローカルにサイト全体をダウンロードしたあと、 ファイルを削除した上で、 mirror -Rev で逆ミラーをかけてアップロードしました。
ここで、削除対象のファイルが多い場合は削除対象の html ファイルのリストをエクセルからCSV書き出しして、一括削除スクリプトを書く必要があるかもしれません。
先ほどの例では エクセルの A列に URL, B列に d マークを入れていたので、これを逆転させた上で、 CSV 保存します。 たとえばそのCSVデータ( html-list.csv )が以下のようなテキストファイルならば…
d,http://www.hogehoge.jp/aaa.html
,http://www.hogehoge.jp/bbb.html
d,http://www.hogehoge.jp/ccc.html
d,http://www.hogehoge.jp/ddd.html
,http://www.hogehoge.jp/eee.html
まず 先頭が d からはじまる行だけが削除対象になるため grep で d からはじまる行を出力します.
$ cat html-list.csv | grep "^d"
d,http://www.hogehoge.jp/aaa.html
d,http://www.hogehoge.jp/ccc.html
d,http://www.hogehoge.jp/ddd.html
さらに d,http://www.hogehoge.jp/ が不要な情報になるため、これを削除するには sed で該当文字列を除去します.
$ cat html-list.csv | grep "^d" | sed -e "s/^d.*jp\///"
aaa.html
ccc.html
ddd.html
こうして出来た削除対象ファイルリストを delete-html-list.txt に書き出して…
$ cat html-list.csv | grep "^d" | sed -e "s/^d.*jp\///" > delete-html-list.txt
あとは、以下のようなシェルスクリプトを使えば、削除対象ファイルを一括削除できるでしょう。
#!/bin/bash
while read LINE
do
echo $LINE
rm -f $LINE
done < delete-html-list.txt
※ delete-html-list.txt から一行ずつ読み込んで(1行分のデータは LINE 変数に格納される)削除を実行しています。