貧乏暇だらけ

筋トレとサプリのブログ

WindowsでLinuxの「cp --parents」のようにディレクトリ構造を保ったままコピーする方法

やりたいこと

f:id:aresta9:20191009232810p:plain
↑このようなディレクトリ構造がある時

f:id:aresta9:20191009233340p:plain

↑特定のファイル(赤字)と親ディレクトリを別の場所にコピーしたい時がある。

f:id:aresta9:20191010000548p:plain

↑この形でコピーしたい

ディレクトリ構造を保ったままコピーする

ファイルだけをコピーしたいのであれば普通にコピーすれば良い。

問題なのが、今回はそのファイルだけじゃなくて、祖先ディレクトリも欲しいということ。

さらに、道中にある余計なサブディレクトリやファイルは要らないということ。

※上図の例であれば、C:\project\data\users.txt だけをファイルパスを保ったまま別の場所に複製したいのです。

バッチファイルを作りました

Linuxであれば cp --parentsで一発なのだけれど、Windowsにそんなコマンドは無い。

xcopy で行けそうに見えるけど、単純にやると余計なものまでくっついてくる。

私はコレをどうしてもWindowsだけでやりたかったので、Windowsで動くバッチファイルを作りました。

ファイル全文

@echo off

SET copyto=%~dp0

:loop
if "%~1" == "" goto end
     if exist "%1\" (
        echo D|xcopy %1 %copyto%%~p1%~n1 /Y /S
     ) else (
         xcopy %1 %copyto%%~p1 /Y /S
     )
shift
goto loop
:end

echo コピー完了したよ
pause

使い方
  1. 上記をテキストエディタにコピペして保存
  2. ファイルの拡張子を.batに変える
  3. 抽出したいファイルをbatファイルにドラッグ&ドロップ
  4. batファイルと同じディレクトリに抽出(コピー)される

f:id:aresta9:20191009235038p:plain

アイコンにD&Dして使う。

ディレクトリのコピーにも対応しています

もしかしたら、あなたがコピーしたいものはファイルじゃなくて、ディレクトリかもしれない。
そんな時のために、ディレクトリをそのままドラッグ&ドロップしても動くように考慮しました。

また、上記コードでは中身が空のディレクトリが除外されますので、空ディレクトリを含めて配下の階層を丸ごとコピーしたい時は6行目末尾の /S/Eに変えると良いです。

※ディレクトリをD&Dした時には、そのディレクトリ配下のサブディレクトリとファイルを全て抜き出します。

注意点
  • パスに半角スペースが混じってると「無効なパラメーターの数です」ってなる
  • コピー元とbatファイルの場所が同じだと「サイクリックコピーはできません」ってなる
  • コマンドプロンプトが文字化けする人はUTF-8に変えると直るかもしれない。(表示だけなので動作に影響ないはず)

作ってみた感想

Windowsのコマンドなんて初めてまともに触りましたが、書いててわけわからんかったです。今読み返してもわけわからんです。コードのお作法もわかりませんので、もしかしたら変な書き方してるかもです。

「とにかく動けばええんですよ!」って人だけ参考にして下さい。

 

ちなみに、当ブログはITブログではなく、筋トレブログです。