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=neverfoo~のように、ファイル名にチルダを付けた名前でバックアップする。すでにfoo~が存在すれば、foo~は 上書きされる。--backup=numberedまたは--backup=tfoo.~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= の直後に . などを付けたほうが見やすい。