ユアマイスター株式会社エンジニアブログ

ユアマイスター株式会社のエンジニアが日々徒然。

sitemap.xmlからディレクトリ名だけ抜き出す

きっかけ

あなたのマイスターでもページがだんだん増えてきたので、 sitemap.xmlの見直しを行おうと思い、下記サイトを利用しようとした。

www.sitemapxml.jp

このサイトではURLを設定すると自動でsitemap.xmlを吐き出してくれる仕様。

制限事項

先ほどのサイトの最下部に注意書きがある。

一度の作成で、最大1,000URLの取得が可能です。

1,000URL以上は「除外ディレクトリ」をご活用ください。例えば、1,000URL以上あるxxxxx.com/のサイトマップを作成する際、xxxxx.com/ABC/、xxxxx.com/DEF/、のみのURL構成だった場合は、ABCとDEFを別々に除外ディレクトリに指定し2つのsitemap.xmlを生成します。その後どちらかにまとめて一つのsitemap.xmlとするか、2つのsitemap.xmlをアップしそれぞれ認識させます。

最大1,000という制限はかなり難敵で、除外ディレクトリの設定によってうまく回避して 満遍なく吐き出してもらう必要があった。

どうするか

もう少し調べていくと、多くページ数を用意しているのは、 第二階層以下の様々なID類の組み合わせによるものだとわかった。

こうなったら第二階層のディレクトリ1個ずつ指定してsitemap.xmlを抽出できたらいいのに、と思い 非効率ではあるが、既存のsitemap.xmlから、第二階層のディレクトリ名を抜き出して、 複数回に分けて抽出しようと思った。

やり方

以下のようなコマンドで第二階層のディレクトリを取得した。

cat sitemap.xml | grep http | awk -F/ '{print $4}'| sed -e 's/<//g'| sort | uniq | awk -F\n -v ORS=','  '{print}'

ここで使っているコマンドを一個ずつ分解していくと

  • cat sitemap.xml

    • sitemap.xmlを開く
  • grep http

    • httpという文字列が含まれる行のみ表示
  • awk -F/ '{print $4}'

    • スラッシュ区切りで左端から4項目のみ表示
    • $4$5にすれば、第三階層で同じことができる(はず)
  • sed -e 's/<//g'

    • <という文字列を取り除く
    • awksedは元ファイルの中身を書き換えずに色々試せるのでマジ便利
  • sort | uniq

    • 重複を削除
  • awk -F\n -v ORS=',' '{print}'

    • カンマ区切りの横一列で表示

ずらっとかくと、よく使うコマンドの総会のようになっていたので、 書きながらエンジニアブログに書こうとニヤニヤしてしまったw

まとめ

  • 後から調べてみると、そもそも全URLをsitemap.xmlに載せる必要はなかったので無駄足感はあった
  • それでも、普段から使える小技を用意しておくと、ターミナルで文字列操作ができるので人間がコンピュータを使ってやった感が出る
  • たまにはこういう細かい手仕事みたいなのもいい脳みその有酸素運動