こんにちは。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!!