cp コマンド 2016/04/27
ファイルをコピーするコマンド。別のホストにファイルをコピーするにはrsync
を使う。コピーではなく移動させるにはmv
を使う。
install
というよく似たコマンドもある。install
コマンドはコピーしながら、コピー先のファイルのパーミッションやオーナーを設定できる。
root権限でソフトウェアをインストールするときによく使われるらしい。
基本的な使い方 2016/03/18
その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
インストール 2016/03/17
Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。
オプション 2016/05/20
-b
,--backup
- コピー先がすでに存在した場合、
foo~
のような名前でバックアップを取る。 ->バックアップオプション -d
- コピー元にシンボリックリンクがあった場合は、通常はリンク先ファイルをコピーし、 シンボリックリンクだったという情報が失われるが、 このオプションを付ければ、シンボリックリンクとしてそのままコピーされる。
--help
- ヘルプ表示
-i
- コピー先にすでにファイルが存在する場合は、上書きするかどうかを聞いてくる
-l
- ファイルのコピーはハードリンクにする。ディレクトリはハードリンクにはならない。
-p
- パーミッション、ユーザ・グループ、タイムスタンプもコピーする。
ちなみに
rsync
コマンドでは-p
ではタイムスタンプを保存してくれず、-t
が必要になる。 -r
,-R
,--recursive
- ディレクトリの中を再帰的にコピーする
-u
- コピー先にすでにコピー元よりも新しいか同じタイムスタンプのファイルがあった場合はコピーをしない
-v
- ファイル名を表示しながらコピーする
--version
- バージョン表示
--
というパラメータを渡すとそれ以降のパラメータをオプションではなくファイル名とみなしてくれるので、
-
で始まるファイル名を扱いたい場合に使うとよい。
注意! 2013/10/09
複数のファイルをコピーしたくて、ファイル名を入力している途中で間違ってエンターを押しちゃったときに、最後のファイル名がコピー先となってコピーを実行してしまい、ファイルを破壊してしまうので、要注意。
target
ディレクトリに複数のファイルをコピーしようと、
cp foo.txt bar.txt target
のように入れるつもりが、間違って
cp foo.txt bar.txt
の段階でエンターを押してしまうと、bar.txt
の内容が失われて、
foo.txt
が bar.txt
にコピーされてしまう。
バックアップオプション 2016/04/27
-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
という環境変数でカスタマイズできる。
ディレクトリ名も含めてファイルをコピーするには 2013/09/16
cp --parents abc/def/ghi.dat /home/who/
この場合、コピー先には /home/who/ghi.dat
ではなく /home/who/abc/def/ghi.dat
という名前でコピーされる。コピー先にディレクトリが存在しない場合は自動で作成される。
rsync
での同じ役割をはたすのは -R
。
すでに同名のファイルがコピー先にあったときにバックアップを残しておくには 2015/11/22
-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=
の直後に .
などを付けたほうが見やすい。