ファイルをコピーするコマンド。別のホストにファイルをコピーするにはrsync
を使う。コピーではなく移動させるにはmv
を使う。
install
というよく似たコマンドもある。install
コマンドはコピーしながら、コピー先のファイルのパーミッションやオーナーを設定できる。root権限でソフトウェアをインストールするときによく使われるらしい。
$ cp src.txt new.txt
別のディレクトリにも
$ cp src.txt foo/new.txt
foo
といディレクトリがすでに存在するとして、その中にコピー
$ cp src.txt foo
ディレクトリが存在しない場合はその1のパターンになって、foo
というファイルが作られる。
複数ファイルもOK。最後の引数がコピー先となるディレクトリになる。
$ cp src1.txt src2.txt foo
srcdir
というディレクトリがあり、newdir
という新しいディレクトリにコピー
$ cp -r srddir newdir
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.txt
がbar.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=
の直後に.
などを付けたほうが見やすい。