cp

 ここではファイルのコピーを行う「cp」コマンドの説明をしてみたいと思います。基本形は「mv」と同じで、「cp コピー元 コピー先」です。今回の例ではterminaltestというディレクトリ内に用意した、test1.rtf、test2.rtfという2つのファイル、testfolder1、testfolder2という2つのディレクトリ(=フォルダ)を対象に実験します。

[localhost:~] hiro% cd ~/terminaltest
[localhost:~/terminaltest] hiro% ls
test1.rtf    test2.rtf    testfolder1  testfolder2

 では基本中の基本動作から始めましょう。ここではtest1.rtfをtestfolder1にコピーしています。

[localhost:~/terminaltest] hiro% cp test1.rtf testfolder1
[localhost:~/terminaltest] hiro% ls
test1.rtf    test2.rtf    testfolder1  testfolder2
[localhost:~/terminaltest] hiro% ls testfolder1
test1.rtf

 複数まとめてコピーもOKです。複数まとめてコピーの場合は、それぞれ半角スペースで区切って並べるだけで、最後の一つがコピー先になります。コピー先はディレクトリでなければなりません。
[localhost:~/terminaltest] hiro% cp test1.rtf test2.rtf testfolder2
 と打ち込むと、test1.rtfとtest2.rtfがtestfolder2にコピーされます。

[localhost:~/terminaltest] hiro% ls testfolder2
test1.rtf    test2.rtf    testfolder3

 さて、最初の実験でtestfolder1にはtest1.rtfがコピーされていますが、ここでもう一度コピーしたらどうなるかと言うと、、、例によって問答無用の上書きです。ここで、「mv」の場合と同様に上書きの警告が欲しいところですね。さてそれではオプションで「-i」を入れてみましょう。

[localhost:~/terminaltest] hiro% cp -i test1.rtf testfolder1
overwrite testfolder1/test1.rtf? y

と、このように警告文が出るようになりましたね。  コピーの名前を変える、なんて事もできます。

[localhost:~/terminaltest] hiro% cp test2.rtf testfolder1/test6.rtf
[localhost:~/terminaltest] hiro% ls testfolder1
test1.rtf test6.rtf

 上記の例ではtest2.rtfをtest6.rtfと言う名前でtestfolder1の中にコピーしています。
 これまではファイルのコピーだけをやってきましたが、実はディレクトリのコピーは素直にはできません。このようにtestfolder2をtestfolder1にコピーしようとすると、

[localhost:~/terminaltest] hirokazu% cp testfolder2 testfolder1
cp: testfolder2 is a directory (not copied).

と言う具合に、testfolder2はディレクトリじゃボケ!と怒られてしまいます。そこで「ウダウダ言わずにやらんかい、ワレ!」とゴリ押しするのに「-R」オプションを使います。

[localhost:~/terminaltest] hirokazu% cp -R testfolder2 testfolder1
[localhost:~/terminaltest] hirokazu% ls testfolder1
testfolder2

 ちなみに、上書きが心配な場合は「-Ri」と並べて書いて下さい。  また、これもmvと同じですが、

[localhost:~/terminaltest] hirokazu% cp -R testfolder2 testfolder1/test1.rtf
cp: testfolder1/test1.rtf: Not a directory

と。ディレクトリでファイルを上書きしようとすると、やはり、ドあほ!と怒られます。

 それではmvと同じように表で整理してみましょう。

コピー元 コピー先 結果
ファイル ディレクトリ 移動元のファイルを移動先のディレクトリの中にコピーする
ファイル 同じ名前のファイル 移動先のファイルを上書きする
ファイル 存在しないファイル名 ファイルの名前を変えてコピーする
ディレクトリ ディレクトリ 移動元のディレクトリを移動先のディレクトリの中にコピーする(要-Rオプション)
ディレクトリ 存在しないディレクトリ名 ディレクトリの名前を変えてコピーする(要-Rオプション)
ディレクトリ ファイル 怒られる

 さて、今回はこれぐらいで、、、と終わりたいところですが、cpには他にもオプションがあり、ちょっとそれについても解説しておきたいと思います。

-f:Macを使っている間はまず意識することの無かった、ファイルの所有者とアクセス権ですが、UNIXでは大いに意味を持ちます。書き込み権限の無いファイルをcpで上書きしようとしても通常はできません。そこを強制的に上書きさせてしまうのが、このオプションです。このオプションを使うと「-i」オプションは無効になり、警告文は表示されなくなります。

-p:ファイルには修正日、所有者のID、所有者グループのIDといった情報も書き込まれていますが、オプション無しのcpではこれらの情報がコピー先のファイルについては書き換えられてしまいます。それを防ぐためにはこのオプションを使用します。

-L:これは-Rオプションと併用しますので、実際にはcp -RLのような書式になります。このオプションを入れると、コピー元ファイルへのシンボリックリンクがコピー先に書き換えられます。

 いかがでしたでしょうか。やはり正規表現との組み合わせで多数ファイルの一括処理でもしないと使う意味は無さそうですが、これでとりあえず.appの中身を安全に取り出すことができるようにはなりましたね。


2005.08.28追記

10.4以降、cpコマンドはMacのリソースフォークを正しく扱うことができるようになりました。