Home About
Bash

表計算ソフトを使ってウェブサイトに残っている不要ページを削除する方法

大規模なサイトを管理しているとどうしても古いページがサーバに残ってしまうことがあります。
これらの古いページは、トップページ経由でリンクをたどってアクセスするユーザの目に触れることはありませんが、Googleなど検索エンジンから直接アクセスするユーザが、 サイト管理者の意図せずして、古いページにアクセスしてしまうことがあります。

今回、これらの古いページをまとめて削除する仕事の依頼を頂いたので、基本的作業手順をメモしておきます。

作業環境

ステップ1 ファイルリストを作成

まずサイト上にある 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
...

ステップ2 htmlのみ抽出

lftp で作成したファイルリストは html ページ以外のファイルもリストアップされているので、html で終わる(拡張子が html の)ファイルのみ抽出します。

$ cat pagelist | grep "html$" > pagelist_only_html

ステップ3 ドメイン部分を追加

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

ステップ4 チェック結果を管理できるようにURLリストをエクセルにインポート

ステップ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

ステップ5 人間がチェック

ステップ4までで作成した pagelist_only_html.csv をエクセルにインポートしておくことで、 A列にURLがリストアップされます。 あとは、人間が一件ずつチェックして、削除すべきページは B列に 'd' などの削除マークを入れておきます。

ステップ6 削除マーク付きURLを一括削除

削除対象のファイルが決まったら、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 変数に格納される)削除を実行しています。