PowerShell

EPUBを解凍した画像ファイルのリネーム

順番ではないファイル名

電子書籍のファイルフォーマットであるEPUBを解凍すると画像ファイルを抽出することができます。

漫画の場合は表紙から順番に並んでいない状態で解凍されました。

ファイル名が不規則

このままではzipファイルなどにまとめると順番通りにページを開くことができません。

PowerShellを使ってリネーム

手動で対応するのも面倒なので自動的にjpgファイルをリネームするPowerShellを開発しました。

リネームするjpgファイル名を抽出

# 出力ファイルのパス
$outFile = [出力ファイルフルパス]

# 出力ファイルの内容を削除
"" | Out-File $outFile -NoNewline

# XPathクエリで.jpgを含むsrc属性を取り出す
$jpgFilesXpath = "//d:img[contains(@src, '.jpg')]"

# XHTMLファイルを取得するディレクトリのパス
$dirPath = 'C:\tmp\book\out\rename'

# 指定されたディレクトリ内のすべてのXHTMLファイルを取得
$xhtmlFiles = Get-ChildItem -Path $dirPath -Filter '*.xhtml' -File -Recurse

# 名前空間の定義
$namespace = @{ d = "http://www.w3.org/1999/xhtml"}

# 各XHTMLファイルをループしてクエリを実行
foreach ($file in $xhtmlFiles) {
  # Select-Xmlコマンドでクエリを実行
  $result = Select-Xml -Path $file.FullName -XPath $jpgFilesXpath -Namespace $namespace

  # 結果をループしてファイル名をファイルに出力
  $result.Node | ForEach-Object {
  $_.src | Out-File $outFile -Append
  }
}

画像ファイルと同じフォルダに格納されている拡張子「xhtml」からjpgファイル名を抽出
[出力ファイルフルパス]は適時変更してください(テキストファイルで可)

出力結果

表紙からリネームする順番でjpgファイル名が出力されます。

リネームjpgファイル名抽出結果

抽出したjpgファイル名からリネーム

# 出力リストを取得
$fileList = Get-Content -Path [リネームjpgファイル名フルパス]

# ファイルのカウンターを設定
$i = 1

# directory_pathにはリネームしたいファイルが存在するディレクトリパスを設定してください
$directory_path = [リネームファイルフォルダフルパス]

foreach ($file in $fileList) {
  # 元のファイルのパスを取得
  $originalFilePath = Join-Path -Path $directory_path -ChildPath $file
  if (Test-Path -Path $originalFilePath) {
    
    # 新しいファイル名を指定(3桁の数字を持つ文字列にカウンター$iをフォーマットします)
    $newFileName = "A{0:D3}.jpg" -f $i
   
    # 新しいファイルのフルパスを作成
    $newFilePath = Join-Path -Path $directory_path -ChildPath $newFileName

    # ファイル名を変更
    Rename-Item -Path $originalFilePath -NewName $newFilePath

    # カウンターを増やす
    $i++
  } else {
    Write-Output "File $originalFilePath does not exist."
  }
}

[リネームファイルフォルダフルパス]で指定したファルダにあるjpgファイルをリネーム

表紙から順番にリネーム

2本目のスクリプトでAから始まるファイル名にリネームを実施した結果です。

表紙からリネーム

表紙からリネームされているのでzipにまとめても問題なく読むことができます。

動くサンプルで学べるWindows PowerShellコマンド&スクリプティングガイドPowerShell 4.0対応

Rakuten

Amazon

Yahoo!ショッピング

 

  • この記事を書いた人
  • 最新記事

かじ

マッチングアプリで出会った女性と結婚をした埼玉県在住の新婚さん。 ガジェット好きではあるけど子どもができたため下火に。。。 社内SEとしてプログラミングなど自分の知識と経験をいろんな人に役立ってもらえるように記事を更新します!

-PowerShell