SoftwareDesign総集編購入/スクリプトを書いてもうちょっと便利に

久々のブログ投稿です。Loud Twitterに荒らされていた(自分で設定していたんだけど。。)エントリはすっきり削除して、ぼちぼちテーマを決めてエントリを書いていこうと思います。

さてさて、タイトル通り、SoftwareDesignの総集編を買いました! 過去の記事を検索できるのは大変便利で、とりあえずiPhoneにつっこんでGoodReaderで常駐先でも読んでいます。

Software Design 総集編 【2000~2009】(DVD付)

Software Design 総集編 【2000~2009】(DVD付)

ただ、ファイル名がこんな感じなのがイマイチ不便よね。

と言うわけで「元のファイル名_タイトル.pdf」の形に10年分まとめてリネームしてくれるようなスクリプトを書いてみました。sedで上手く抜けなかったので、何故かrubyでゴリ押してます。そしてたぶんMacOSX10.4以上でしか動きません。

#!/usr/bin/ruby -Ku

require 'find'

#
# PDFプロパティの「タイトル」を取得する。
#
def getPDFTitle( pdfFileName )
    # NOTICE: たぶん、MacOSX依存のコマンド
    result = `mdls -name kMDItemTitle #{pdfFileName}`
    if result !~ /.*null.*/ then
        title = result.scan(/".*"/)[0].gsub('"', '').gsub('/','')
    else
        title = ""
    end
    return title
end

#
# リネーム対象のファイルリストを取得する。
#
def getFileList( pathName )
    fileList = []
    Find.find( File.expand_path( pathName )){ |path| 
        # 拡張子.pdfのファイルをリストに格納
        fileList.push path if File::extname( path ) == ".pdf"
    }
    return fileList
end

if __FILE__ == $0 then
    targetDir = ARGV[0]
    if targetDir == nil then
        puts "Usage: ruby -Ku pdf_rename.rb target_dir"
        exit
    end

    fileList = getFileList( targetDir )
    fileList.each{ |path|
        begin
            toName = File::dirname( path ) + "/" + File::basename( path ).delete(".pdf") + "_" + getPDFTitle( path ) + ".pdf"
            File.rename( path, toName )
        rescue
            puts "ERROR: Rename failed " + path
        end
    }
end

動き

  • 引数に指定したディレクトリ以下のPDFファイルを再帰的に探査します。
  • 引っかかったPDFファイルを軒並み「元のファイル名_タイトル.pdf」の形に変換します。
  • 上手くいかなかったらそのファイルだけ諦めます。

 ※サブディレクトリも対象になるので注意して下さい。

使い方

上のスクリプトをpdf_rename.rbみたいな名前で保存して、以下のようにぽちっとなして下さい。

ruby -Ku pdf_rename.rb /PDFを保存しているディレクトリ名をフルパスで

するとこんな感じになります。


MacOSX依存の理由

mdlsというコマンドを利用してファイルのメタデータを取得しています。

いろいろ表示されるんですが、「-name プロパティ名」とオプションを指定すると、指定したプロパティだけ出力できます。

で、sedかなんかでダブルクォーテーションの中身を抜けばタイトルが取得できるという寸法です。

でも、何故かsedで上手くいかなかった

mdls -name kMDItemTitle Keynote09_UserGuide_J.pdf | sed -e 's/.*"\(.*\)".*/\1/'

こんな感じでタイトルだけ抜ける予定だったのですが、何故か処理が固まってしまい、ついカッとなってRubyで書いちゃいました。

echo 'kMDItemTitle = "hogehoge"' | sed -e 's/.*"\(.*\)".*/\1/'
# => hogehoge

って感じで上手く行くんですけどね。もしやタイトルの中にシングルクォーテーションとか入ってるとダメなのかしら。

mdls以外でメタデータを取得する方法は?

  • バイナリで頑張る。
  • ライブラリなんかを頑張って探す。

RubyのPDF系ライブラリは何だか面倒くさそうなので使う気になれませんでした。

総括

SoftwareDesign総集編はコストパフォーマンス最強すぎるので、買えば良いと思います!