cp コマンド

ファイルをコピーするコマンド。別のホストにファイルをコピーするにはrsyncを使う。コピーではなく移動させるにはmvを使う。

install というよく似たコマンドもある。installコマンドはコピーしながら、コピー先のファイルのパーミッションやオーナーを設定できる。 root権限でソフトウェアをインストールするときによく使われるらしい。

基本的な使い方

その1: ファイルを別ファイル名にコピー

$  cp src.txt new.txt

別のディレクトリにも

$  cp src.txt foo/new.txt

その2: ファイル名そのままに別のディレクトリにコピー

foo といディレクトリがすでに存在するとして、その中にコピー

$ cp src.txt foo

ディレクトリが存在しない場合はその1のパターンになって、foo というファイルが作られる。

複数ファイルもOK。最後の引数がコピー先となるディレクトリになる。

$ cp src1.txt src2.txt foo

その3: ディレクトリを再帰的に新しいディレクトリにコピー

srcdir というディレクトリがあり、newdir という新しいディレクトリにコピー

$ cp -r srddir newdir

その4: ディレクトリを再帰的に別のディレクトリの中にコピー

srcdir というディレクトリがあり、targetdir という既存のディレクトリの中に targetdir/srcdir という名前にコピー

$ cp -r srddir targetdir

targetdir が存在しない場合はその3のパターンになって、 targetdir という名前のディレクトリが作られる。

複数ディレクトリもOK。

$ cp -r srddir1 srcdir2 targetdir
スポンサーリンク

インストール

Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。

オプション

-b, --backup
コピー先がすでに存在した場合、foo~ のような名前でバックアップを取る。 ->バックアップオプション
-d
コピー元にシンボリックリンクがあった場合は、通常はリンク先ファイルをコピーし、 シンボリックリンクだったという情報が失われるが、 このオプションを付ければ、シンボリックリンクとしてそのままコピーされる。
--help
ヘルプ表示
-i
コピー先にすでにファイルが存在する場合は、上書きするかどうかを聞いてくる
-l
ファイルのコピーはハードリンクにする。ディレクトリはハードリンクにはならない。
-p
パーミッション、ユーザ・グループ、タイムスタンプもコピーする。 ちなみにrsyncコマンドでは -p ではタイムスタンプを保存してくれず、-t が必要になる。
-r, -R, --recursive
ディレクトリの中を再帰的にコピーする
-u
コピー先にすでにコピー元よりも新しいか同じタイムスタンプのファイルがあった場合はコピーをしない
-v
ファイル名を表示しながらコピーする
--version
バージョン表示

-- というパラメータを渡すとそれ以降のパラメータをオプションではなくファイル名とみなしてくれるので、 - で始まるファイル名を扱いたい場合に使うとよい。

注意!

複数のファイルをコピーしたくて、ファイル名を入力している途中で間違ってエンターを押しちゃったときに、最後のファイル名がコピー先となってコピーを実行してしまい、ファイルを破壊してしまうので、要注意。

targetディレクトリに複数のファイルをコピーしようと、

cp foo.txt bar.txt target

のように入れるつもりが、間違って

cp foo.txt bar.txt

の段階でエンターを押してしまうと、bar.txt の内容が失われて、 foo.txtbar.txt にコピーされてしまう。

バックアップオプション

-b または --backup というオプションを付けるとコピー先にすでにファイルが存在していた場合に、コピー前にそのファイルをバックアップさせられる。

このオプションはcpコマンドだけでなく、mvコマンドlnコマンド、installコマンドでも使える。

バックアップの方式には以下を選択することができる。

オプションを付けない、または --backup=none または --backup=off
バックアップをせずにコピー先を上書きする。(これがデフォルトの動作)
-b または --backup または --backup=existing または --backup=nil
--backup=simple または --backup=numbered どちからの動作。すでに foo.~1~ のような名前のファイルがあれば --backup=numbered で動作し、なければ --backup=simple で動作する。
--backup=simple または --backup=never
foo~ のように、ファイル名にチルダを付けた名前でバックアップする。すでに foo~ が存在すれば、foo~ は 上書きされる。
--backup=numbered または --backup=t
foo.~1~ のように、ファイル名にドットとチルダと番号を付けた名前でバックアップする。すでに foo.~1~ が存在すれば foo.~2~ でバックアップされ、foo.~2~ も存在すれば foo.~3~ でバックアップされる。

チルダは -S または --suffix オプションや SIMPLE_BACKUP_SUFFIX という環境変数でカスタマイズできる。

ディレクトリ名も含めてファイルをコピーするには

cp --parents abc/def/ghi.dat /home/who/

この場合、コピー先には /home/who/ghi.dat ではなく /home/who/abc/def/ghi.dat という名前でコピーされる。コピー先にディレクトリが存在しない場合は自動で作成される。

rsync での同じ役割をはたすのは -R

すでに同名のファイルがコピー先にあったときにバックアップを残しておくには

-b または --backup というオプションを付けると、コピー先にすでにファイルが存在した場合に既存ファイルのファイル名の後ろに ~ を付けてリネームしてから、コピーをする。 ~ 付きのファイル名もまたすでに存在していた場合は ~ 付きの方が上書きで失われる。

$ find
.
./src
./src/a.txt
./dst
./dst/a.txt
$ cp --backup src/a.txt dst/a.txt
$ find
.
./src
./src/a.txt
./dst
./dst/a.txt
./dst/a.txt~

ここでもう一度 cp --backup src/a.txt dst/a.txt とすると、 ./dst/a.txt~ は削除され、./dst/a.txt./dst/a.txt~1 にリネームされてからコピーされる。

--backup=t というオプションにすると、2つのチルダの間に番号をつけたファイル名でバックアップしてくれる。このオプションでは何度同じファイル名でバックアップしても古いファイルが上書きで失われることはない。

$ find
.
./src
./src/a.txt
./dst
./dst/a.txt
$ cp --backup=t src/a.txt dst/a.txt
$ find
.
./src
./src/a.txt
./dst
./dst/a.txt
./dst/a.txt.~1~

ここで ./dst/a.txt.~1~ がある状態でもう一度バックアップすると、 ./dst/a.txt.~1~ はそのままに、既存の /dst/a.txt./dst/a.txt.~2~ にリネームされる。

$ cp --backup=t src/a.txt dst/a.txt
$ find
.
./src
./src/a.txt
./dst
./dst/a.txt
./dst/a.txt.~1~
./dst/a.txt.~2~

ちなみにすでに番号付きのバックアップファイルがあれば --backup だけでも自動で番号付きのバックアップファイル名になる。

$ cp --backup src/a.txt dst/a.txt
$ find
.
./src
./src/a.txt
./dst
./dst/a.txt
./dst/a.txt.~1~
./dst/a.txt.~2~
./dst/a.txt.~3~

-b または --backup オプションに --suffix オプションを併用すると、バックアップファイルのファイル名末尾に付ける文字列を指定できる。ここで date コマンドを使えばバックアップ時の日時をファイル名に入れることができる。

$ cp -b --suffix=.`date +%Y%m%d-%H%M%S` src/a.txt dst/
$ find
.
./src
./src/a.txt
./dst
./dst/a.txt
./dst/a.txt.20151122-205329

--suffix で指定する文字列はバックアップファイル名の後ろにそのまま付くので、日時にするのであれば --suffix= の直後に . などを付けたほうが見やすい。

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。