Unix/Linuxのcp, mvコマンドとDOS/Windowsのcopy, moveコマンドはほぼ同じ機能を持ちますが、少し違いがあります。両方使っていると混乱することがあります。Unix系コマンドcp, mvのほうを基準として考えて、copy, moveがそれらとどう違うかを実例で示します。
実験の状況
2つのディレクトリ /tmp/foo/, /tmp/bar/ が既にあり、2つのファイル /tmp/foo/a.txt, /tmp/foo/b.txt もある状態。カレントディレクトリは /tmp/。
Unixコマンド cpとmv
コマンド | 結果 |
---|---|
cp foo/* bar | bar/a.txt と bar/b.txt が新たにできる |
cp foo/* bar/ | bar/a.txt と bar/b.txt が新たにできる |
cp foo/* baz | エラー(1) |
cp foo bar | エラー(2) |
cp foo bar/ | エラー(2) |
cp foo/ bar/ | エラー(2) |
cp foo baz | エラー(2) |
コマンド | 結果 |
---|---|
mv foo/* bar | foo/a.txt と foo/b.txt が bar/ の下に移動 |
mv foo/* bar/ | foo/a.txt と foo/b.txt が bar/ の下に移動 |
mv foo/* baz | エラー(3) |
mv foo/* baz/ | エラー(3) |
mv foo bar | foo/ とその中身が bar/ の下に移動 |
mv foo bar/ | foo/ とその中身が bar/ の下に移動 |
mv foo/ bar/ | foo/ とその中身が bar/ の下に移動 |
エラー(1):
エラー(2):
cp: target `baz' is not a directory
エラー(3):
cp: omitting directory `foo'
mv: target `baz' is not a directory
Unixでは、ワイルドカード展開をシェルがするので、cp foo/* bar は、cp foo/a.txt foo/b.txt bar と同じです。複数のファイルのコピーは、コピー先がディレクトリ(場所)である必要があります。1つのファイルのコピーは、コピー先がファイル(もの)でもディレクトリ(場所)でもOKです。
昔は、ディレクトリをファイルにコピーできました。コピー先は単なるバイナリファイルになったと思います(記憶が薄れているが)。今は、ディレクトリそのものをコピー対象にはしないんですね。
DOSコマンド copyとmove
Unixと動作が同じとみなしていいときは○、そうでないときは×で示します。どちらもエラーであっても、エラーの意味合いが違えば×です。△はけっこう似てるってこと。
コマンド | 結果 |
---|---|
copy foo\* bar | ○ |
copy foo\* bar\ | ○ |
copy foo\* baz | × ファイル baz ができる。cat foo/* > baz と同じ |
copy foo bar | × bar\a.txt と bar\b.txt が新たにできる |
copy foo bar\ | × bar\a.txt と bar\b.txt が新たにできる |
copy foo\ bar\ | × bar\a.txt と bar\b.txt が新たにできる |
copy foo baz | × ファイル baz ができる。cat foo/* > baz と同じ |
copy foo baz\ | × エラー(A) |
コマンド | 結果 |
---|---|
move foo\* bar | ○ |
move foo\* bar\ | ○ |
move foo\* baz | △ エラー(B) |
move foo\* baz\ | △ エラー(B) |
move foo bar | ○ |
move foo bar\ | ○ |
move foo\ bar\ | × エラー(c) |
エラー(A):
エラー(B):
foo\a.txt
指定されたパスが見つかりません。
foo\b.txt
指定されたパスが見つかりません。
0 個のファイルをコピーしました。
エラー(C):
C:\tmp\tmp>move foo\* baz
複数のファイルを 1 つのファイルに移動することはできません。
C:\tmp\tmp>move foo\ bar\
指定されたファイルが見つかりません。
copy foo bar
と、bazが存在しないときの copy foo\* baz
が要注意ですね。move foo\ bar\
はなんか意味不明。