PowerShell+robocopyで拡張子別にファイルを一括移動する方法

概要

本記事では、PowerShellで拡張子別にファイルを一括移動する方法について解説していきます。

というのもGoogle Takeoutから大量にデータをダウンロードすると、画像・動画・JSONがごちゃ混ぜで困りますよね(- -;

手作業で振り分けるのは現実的じゃないので、コマンドでサクッと分類したい所です。

ここではrobocopyを使って、.jpg/.png/.mp4などの拡張子だけを別フォルダへ移動する手順を紹介していきます!

これで大量画像の整理が一瞬で終わります。
それではやっていきましょう!

当たり前ですが、移動のコマンドを使用する際はシステムファイルなどを移動するとシステムに影響を与える可能性があります。
注意して、自己責任で実行するようにしてください。

目次

初期状態のフォルダ構成

今回の手順実行前のフォルダ構成は下記のようなイメージです。

手順を実行するにつれて、フォルダ内の状態がどう変化するのか各手順に書いているので、参考にしてみてください。

<初期状態のフォルダ>
  • folder1
    • aaa.png
    • bbb.json
  • folder2
    • ccc.mov
    • ddd.mp4
    • eee.json

手順

再帰的に特定の拡張子のファイルを移動

再帰的にファイルを移動するコマンドを実行します。

実行すると、特定の拡張子のファイルを任意のフォルダに移動することができます。

コマンド

1
robocopy "[移動元パス]" "[移動先パス] " [拡張子1] [拡張子2 ...] /S /MOV /NFL /NDL

例:画像&動画のコピー

1
robocopy ".\google_export\" ".\google_export_photo_only\" *.jpg *.jpeg *.png *.heic *.mp4 *mov *.MOV /S /NFL /NDL

例:画像&動画の移動(個人的には非推奨)

1
robocopy ".\google_export\" ".\google_export_photo_only\" *.jpg *.jpeg *.png *.heic *.mp4 *mov *.MOV /S /MOV /NFL /NDL 
<オプション>
  • /S
    • 再帰的にサブフォルダを探索(空フォルダは無視)
  • /MOV
    • ファイルを移動(コピー後、元ファイルを削除)
    • ※このオプションを無くすと、コピーとなる
  • /NFL
    • 実行中にファイル一覧のログを表示しない
    • ※ このオプションを無くすと、 ログを表示される
  • /NDL
    • 実行中にディレクトリ一覧のログを表示しない
    • ※ このオプションを無くすと、 ログを表示される

移動先パスに画像と動画が配置されることを確認できると思います。

しかしこの方法の場合フォルダ構成も引き継ぐので、
次の手順でフォルダ構成を削除していきます。

<現在のフォルダ内の状態>
  • folder1
    • aaa.png
  • folder2
    • ccc.mov
    • ddd.mp4

フォルダ構成を削除

robocopyコマンドだとフォルダ構成もコピーされる為、
フォルダ構成を無くし、フォルダ直下にすべてのファイルが配置されるようにします。

念のため新たに作成したフォルダにコピーする形とします。

コマンド

1
forfiles /P "[移動元パス] " /S /M * /C 'cmd /c copy @path "[移動先フルパス]"'

例:画像&動画のコピー

1
forfiles /P ".\google_export_photo_only\" /S /M * /C 'cmd /c copy @path "C:\Users\user1\google_export_photo_only_comp\"'
<オプション>
  • /P
    • 検索フォルダを指定
  • /S
    • サブフォルダをすべて含めて再帰検索
  • /M
    • 移動対象ファイル名を指定
    • ※今回は*なので全部のファイルが対象
  • /C
    • コマンドを実行
    • ※今回はファイルをコピーするコマンドを実行
  • @path
    • 探査で発見されたファイルパス
<現在のフォルダ内の状態>
  • aaa.png
  • ccc.mov
  • ddd.mp4

ファイルが移動できたか確認

すべてのファイルが正常に移動できたか確認するために、移動元のファイル数と移動先のファイル数が一致していることを確認します

コマンド

1
(Get-ChildItem "[移動元パス or 移動先パス ].\google_export\" -Recurse -Include [拡張子1] [拡張子2 ...] -File).Count

例:画像&動画の場合

1
2
3
4
5

-- 移動元
(Get-ChildItem ".\google_export\" -Recurse -Include *.jpg,*.jpeg,*.png,*.heic,*.mp4,*mov,*.MOV -File).Count
-- 移動先
(Get-ChildItem ".\google_export_photo_only_comp\" -Recurse -Include *.jpg,*.jpeg,*.png,*.heic,*.mp4,*mov,*.MOV -File).Count

ここで件数に差異がある場合、重複ファイルが存在する可能性が高いため、確認する。

大事なファイルが消えないようにするために念のため確認しておきましょう!

締め

これでファイルの移動ができたと思います。

コマンド一つ一つは難しいですが、手動でやるより圧倒的に楽に早くできると思います。

こんな感じの便利なコマンドを自分のサイトでは色々紹介しています。
良ければ他の記事も見ていってください!

以上となります。
大事なファイルを安全にお引越ししましょう!
それではお疲れさまでした!