Powershell: 特定フォルダー内のファイル拡張子を全部変える

パソコンを使って、一つのフォルダーにファイルをため込んでゆくと、ファイル数が少ないうちは何も問題無いのですが、ファイル数が増えてゆき、拡張子をまとめて変更したいような場合が発生します。

例えば、

  1. .txt として保存してたファイルを、他のファイルと形式を合わせるために、.log に変更したいようなケース。
    a.txt, b.txt, c.txt → a.log, b.log, c.log
  2. .csv として保存していたファイルを、.txt に変更して、Excelが入っていないPCでもメモ帳で開けるようにしたいようなケース。
    aa.csv, bb.csv, cc.csv → aa.txt, bb.txt, cc.txt

もし、

rename *.txt *.log

という、コマンドが Windowsや Unixに あれば便利なんですけどね。

このようなケースでの流れは、

  1. フォルダーのカタログを取る
  2. ファイル名を、ベースと拡張子に分ける
  3. ベース+拡張子 → ベース+新しい拡張子 にリネームする
  4. 上記2と3をループさせる

という流れになります。

$a = dir *.txt
foreach ( $src_name in $a.Name ){
   $base_name = $src_name.Split(".")[0]
   Move-Item -Verbose $base_name".txt" $base_name".log"
}

この例では、name.suffix をファイル名と拡張子に分解するために split を使っていますが、Powershell ではもっと簡単にもっと正確に分離する書式が複数あります。
また、8.3形式の時代ならともかく、今は、ファイル名の中にピリオドが複数あっても許可されますので、上記書式が通用するのは機械的に出力されるログファイルのような場合だけ。ファイル名をサマリー代わりに使っているようなシステムでは役に立ちませんので、(ここでは紹介しませんが)別のコマンドを使う事になります。

ここまでなら、わざわざメモするほどのことでもないのですが、Move-Item コマンドを ffmpeg に置き換えると結構使えます。

例えば、特定フォルダーの中の

  • FLV形式ファイルを M4V形式に変換する場合。
  • 画面サイズををモバイル用に小さくする場合。
  • トーク番組音声ファイルのビットレートを下げて、ファイルサイズを圧縮したい場合。

変換系は、ユーティリティもたくさん出てますので、わざわざコマンドを使うこともないかもしれませんが、コマンドの良い点は、タスクマネージャに登録して自動で変換出来ること。

Move-Item -Verbose $base_name".txt" $base_name".log"

の部分を、

FFMPEG.EXE -n -i $base_name".flv" $base_name".mp4"

とすれば、特定フォルダーの中の flvファイルを、次々と m4v形式に変換してくれます。

Comments

  1. >rename *.txt *.log
    ええと、Windowsのコマンドプロンプトで上記のような、拡張子txtのファイルをまとめて拡張子logにリネームというのは普通にできることではないでしょうか。
    >ren *.txt *.log
    で出来ますし、リネーム元の拡張子が複数種あっても、一律に変更してよいのであれば、
    >ren *.* *.log
    で可能です。

    ちょっと今回のエントリのように難しくする必要性が正直よくわかりませんでした。ファイル名に複数のドットを含む場合でも、上記のコマンドではファイル名.拡張子の一番末尾の拡張子にだけ反応するので、あまり悩まなくてもいいような……

    私がよく理解できていないだけであれば済みません。一読しての率直な感想としてはこのように感じました。

Ole Paso Amigo へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です