Milkのメモ帳

日々の思いつきを忘れないようにのメモ用です。

Milkのメモ帳

【cmd】ドライブをまたいでフォルダ/ファイルを移動する【コマンドプロンプト】


f:id:maxminkun:20191025145908p:plain

こんにちは。Milkです。
いやー。cmd(コマンドプロンプト)に殺意が湧きますね。
(-_-メ)

何度も手動でやるのは面倒なので、バッチを書いて処理をする人は多いと思います。

今回はまり込んだのは、「フォルダ/ファイルの移動」

え? それって「move」を使えばいいじゃん。はい。解散。

と思うでしょ?

いやいや。それがさ・・・ドライブをまたいだ場合は「どうにもならん!」ということに。


「move」コマンド

やりたいことは、例えばDドライブにあるファイルやフォルダを、Eドライブに移動したいってこと。

まぁ、最初に思いつくのは「move」コマンドですよ。

では、「move」コマンドのリファレンスを見てみましょうか?

因みに、コマンドのリファレンスを見るには、

コマンド名 /?

で表示出来ます。(他にも、/help オプションとか方法は色々あるよ。)

今回はこんな感じ。

>move /?
ファイルを移動およびファイルとディレクトリ名を変更します。

複数のファイルを移動するには:
MOVE [/Y | /-Y] [ドライブ:][パス]ファイル名1[,...] 受け側

ディレクトリ名を変更するには:
MOVE [/Y | /-Y] [ドライブ:][パス]ディレクトリ名1 ディレクトリ名2

  [ドライブ:][パス]ファイル名1
                          移動するファイルの場所と名前を指定します。
  受け側                  ファイルの新しい場所を指定します。移動先はドライブ
                          文字とコロン、ディレクトリ名、または組み合わせから成
                          ります。1 つのファイルだけを移動する場合で、その
                          ファイルを移動するときに名前を変更する場合、
                          ファイル名を指定できます。
  [ドライブ:][パス]ディレクトリ名1
                          変更するディレクトリ名を指定します。
  ディレクトリ名2         新しいディレクトリ名を指定します。
  /Y                      移動先の既存のファイルを上書きする前に確認の
                          メッセージを表示しません。
  /-Y                     移動先の既存のファイルを上書きする前に確認の
                          メッセージを表示します。

環境変数 COPYCMD にスイッチ /Y を設定できます。これは、コマンド ラインの /-Y
で無効になります。既定では、MOVE コマンドがバッチ スクリプトから実行され
ていない場合、上書きを確認します。

「move」は同じドライブだけ

ここで落とし穴があって、

MOVE [/Y | /-Y] [ドライブ:][パス]ディレクトリ名1 ディレクトリ名2

つまり、2つ目の引数には、「変更先のディレクトリ名だけを入れよ」となっているわけです。

変更元はフルパスで入れますが、変更先についてはディレクトリ名だけ。

ということは、「ドライブ間の移動は出来ない」ということを指しています。

試しに第2引数にフルパスで、違うドライブを指定しましたが、「構文誤り」として動きませんでした。


「xcopy」と「rd(rdir)」を利用する

残念ながら、簡単に「move」は出来ないということで、苦肉の策で「xcopy」と「rd(rdir)」を利用することに。

「xcopy」コマンドは普通の「copy」コマンドと異なり、オプションで指定すれば、コピー元と同じ階層をコピー先に作成しながらコピーしてくれます。

また、コピー先が別ドライブであっても指定可能です。

んで、次にするのは、二重でフォルダやファイルが存在すると容量を圧迫するので、「rd(rdir)」でコピー元を削除します。

格好悪いですけど、試行錯誤してこの方法にたどり着きました。

要はこういうことです。

> xcopy /e D:\hogehoge\hogefolder E:\hogehoge\
> rd /s /q D:\hogehoge\hogefolder

オプションの解説

先程の方法でリファレンスを見てもらった方が楽な気がしますが、一応は指定したオプションについて解説します。

「xcopy」では、「/e」を指定しています。

これは、コピー元に空フォルダがあっても、同様にフォルダをコピーするというオプションです。

また、第2引数のフルパスの最後に「\」を入れています。

これは、「Dドライブのhogefolder を Eドライブのhogehogeフォルダの下にコピーしてくれ」という意味です。

最後に「\」がないと、「コピー先はフォルダなの?ファイルなの?」と聞いてきて、処理が中断します。

なので、明示的に「\」を入れて、「フォルダである」ということを認識させます。

「rd」(これは「rdir」の短縮形)では、「/s」「/q」のオプションを指定しています。

「/s」は、「指定したフォルダ以下全てのサブフォルダ(サブディレクトリ)含めて削除」というオプション。

「/q」は、「本当に削除する?」って聞いてくるのを黙らせる(聞いてこないようにする)というオプションです。

最後に

単純にドライブをまたいでフォルダを移動させたいだけなのに、コピーして削除という2ステップをさせないといけない煩わしさ。

そもそも、「Windows」はドライブパーティションという概念で分割されており、各々のドライブはつながっていません。

「Linux」や「Unix」(「Mac」は「Unix」派生OSです)は、「root」という中心の存在があり、それに対してそれぞれのフォルダ(ディレクトリと呼ぶ)はぶら下がっているという考え方です。

よって、全てはつながっており、一部のディレクトリ階層をユーザーに開放するという考え方なのです。

よく「root権限を奪取した!」と騒いでいるのを聞くかもしれませんが、要は根幹の部分にアクセス出来るようになり、「全てのフォルダ(ディレクトリ)を思い通りに操作出来るようになった」ということです。

この仕事をしていると、「Windows」も「Linux」も、はたまた「Mac」や「Unix」も使いますから、だんだんと覚えたコマンドがごちゃごちゃになってきます・・・

弱ったものです・・・

それでは、今回はこの辺で。

adios!!