ファイルのコピー

ファイルをコピーする

$ cp file1 file2
$ cp file1 file2 file3 /tmp
$ cp -vr dir1 /tmp
 -f 確認なしで上書き(デフォルト)
 -i 上書きの確認(yで実施)
 -l ハード・リンクの作成(ディレクトリは除外)
 -p 元ファイルの属性(タイムスタンプ等)を保持
 -r ディレクトリを丸ごとコピー
 -s シンボリック・リンクの作成
 -u コピー先のタイムスタンプが同じか新しいときはコピーしない
 -v 経過表示

オプションを何もつけないと確認なしに上書きされてしまうので要注意。心配なら「cp -vi」にしておく。
引数を2つ書いた場合は、引数1から引数2へのコピー。引数2がディレクトリなら引数1のファイルがそのままコピーされ、引数2がファイルなら、そのファイル名でコピーされる。
引数を3つ以上書いた場合は、最後の引数をディレクトリとして認識し、複数ファイルを一度にそのディレクトリへコピーする。(「cp file1 file2 file3」は、file3はディレクトリじゃないと怒られる)

ハードリンク

「cp -l file1 file2」とすると、file1に対するハードリンクfile2が作成される。file2の中身を見てみてもfile1とまったく同じなので、ハードリンクなんていらないじゃんと思ってしまうがそんなことはない。試しにfile1の内容を変更して保存してから、file2の内容を確認してみよう。file1に加えた変更がfile2にも反映されているはず。ハードリンクは物理的に同じものを指す(i-nodeが同じ)ようになっている。
じゃあ、file1を削除したらfile2も消えるの、という疑問が沸く。沸かなくても試してみよう。「rm file1」としてみたら、file1は確かに消えたけど、file2はまだそのまま残ってる。そりゃそうだよね。どれか1つハードリンクを消したら一蓮托生で全部消えてしまったら、ハードリンクなんて怖くて使えないよね。(どれか1つの内容を変更したら一蓮托生で全部の内容が変わるという点には目を瞑って)
仕組みはこう。Linuxがハードリンクのリンク数(参照カウンタ)を持っていて、まだハードリンクがあるうちは実体を消さないでリンク数だけを減らしていく。リンク数がゼロになったら実体を消すということになってるみたい。

シンボリックリンク

「cp -s file1 file2」とすると、file1に対するシンボリックリンクfile2が作成される。こちらはハードリンクと違って物理的に同じものは指さず、file1のパスを保持しているようなものである。

$ cp -s file1 file2
$ ls -li
8208395 -rwxr--r-- 1 mam mam 2349 2008-04-10 05:11 file1
8208396 lrwxrwxrwx 1 mam mam    4 2008-04-10 05:12 file2 -> file1
$ rm file1
$ ls -li
8208396 lrwxrwxrwx 1 mam mam    4 2008-04-10 05:12 file2 -> file1
$ cat file2
cat: file2: No such file or directory
$ cp /etc/file0 file1
$ ls -li
8208397 -rwxr--r-- 1 mam mam 2349 2008-04-10 05:13 file1
8208396 lrwxrwxrwx 1 mam mam    4 2008-04-10 05:12 file2 -> file1
$ cat file2

この例の操作では、file1からシンボリックリンクfile2を作っておき、file1を削除してしまう。「ls -li」ではfile2は(赤色表示で)見えているんだけど、ファイル操作的にはないもの(見つからないもの)とされてしまう。でも、file1を作ってやるとfile2がまた復活する。Windowsのショートカットみたいなもんですね。

エラー

「omitting directory」というエラーが出るときは「cp -r」をつけてディレクトリもコピーの対象にすること。何もつけないとディレクトリはコピーしない。