[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.1 cp: ファイルやディレクトリをコピーする

cp はファイルをコピーする (もしそうしたければ、ディレクトリのコピーもできる)。 コピーによって作られたファイルは、コピー元から全く独立したものになる。 一つのファイルを別のファイルにコピーすることもできるし、 好きなだけたくさんのファイルをコピー先のディレクトリに一遍にコピーすることもできる。

書式:

 
cp [option]… [-T] source dest
cp [option]… sourcedirectory
cp [option]… -t directory source

ほとんどの場合、ファイルは読み込まれたとおりに書き出される。 例外については、後述の ‘--sparse’ オプションをご覧になっていただきたい。

デフォルトでは、cp はディレクトリをコピーしない。 ただし、‘-R’, ‘-a’, ‘-r’ オプションを指定すると、 cp は再帰的なコピーを行う。 すなわち、コピー元のディレクトリを段階的に下って、対応するコピー先のディレクトリにファイルをコピーすることになる。

コピー元がシンボリックリンクの場合、cp がリンクをたどるのは (訳注: すなわち、リンクそのものではなく、参照先の実ファイルをコピーするのは)、 通常では、再帰的なコピーをしていないときか、あるいは、‘--link’ (‘-l’) オプションが使用されているときだけである。 このデフォルトの動作は、次に挙げるオプションによって変更することができる。 ‘--archive’ (‘-a’), ‘-d’, ‘--dereference’ (‘-L’), ‘--no-dereference’ (‘-P’), ‘-H’。 こうしたオプションを二つ以上指定すると、cp は警告を出さず、最後のオプションで他のものを上書きする。

(訳注: 最近の cp では ‘--link’ オプションの動作が変更されている。 コピー元がシンボリックリンクの場合、coreutils-8.21 までは、 デフォルトでは、シンボリックリンクのハードリンクを作っていたが、8.22 以後の cp では参照先ファイルのハードリンクを作るようになっている。)

コピー先がシンボリックリンクの場合、cp がリンクをたどるのは (訳注: すなわち、コピー元ファイルで、リンクそのものではなく、参照先のファイルを上書きするのは)、 そのリンクが、存在する通常ファイルを指しているときだけである。 それに対して、コピー先のシンボリックリンクがリンク切れしている場合は、cp は、デフォルトではコピーを拒否し、エラーメッセージを出して、実行に失敗する。 そうした操作は、本質的に危険だからである。 この動作は、伝統的な習慣や POSIX の仕様に反している。 たとえリスクがあろうとも、リンク切れしたシンボリックリンクの参照先を cp が作成するようにしたいなら、環境変数 POSIXLY_CORRECT を設定すればよい。なお ‘--backup’ や ‘--link’ といったオプションが、コピーする前にコピー先ファイルの名前変更や削除を行う場合、 cp は、リンクが指しているファイルではなく、シンボリックリンクの名前変更や削除を行う。

デフォルトでは、cp がスペシャルファイルの内容をコピーするのは、 再帰的なコピーをしていないときだけである。このデフォルトの動作は、 ‘--copy-contents’ によって変更できる。

cp は通常、ファイルを自分自身にコピーすることを拒否するが、次の例外がある。 sourcedest が同一で、しかも、通常ファイルを指しているとき、 ‘--force --backup’ オプションが指定されると、cp はバックアップファイルを作成することになる。バックアップファイルを標準のものにするか (訳注: ファイルの末尾にチルダ ‘~’ が 1 個付く)、番号付きのものにするかは、 いつもどおりの方法で指定できる (see section バックアップ・オプション)。 存在するファイルに変更を加える前に、そのバックアップをちょっと作っておきたい場合、この動作は便利である。

このプログラムでは以下のオプションが使用できる。参照: 共通オプション.

-a
--archive

コピー元ファイルの構造と属性をコピー先でもできるだけ維持する (ただし、ディレクトリの内部構造を維持しようとはしない。そのため、コピー先で ‘ls -U’ を実行すると、コピー元とは違った順序でファイルがリストされるかもしれない)。 SELinux コンテキストや拡張属性 (xattr) も維持しようとするが、 そうした操作に失敗しても無視し、その旨エラーメッセージを表示することはない。 エラーメッセージが少ないだけで、‘-dR --preserve=all’ と同じある。

--attributes-only

コピー元ファイルの指定された属性のみを、コピー先にコピーする。 コピー先ファイルがすでに存在している場合、その内容を変更することはない。 属性のうち、何をコピーするかを決める方法については、‘--preserve’ オプションの項を見ていただきたい。

-b
--backup[=method]

See section バックアップ・オプション. そのままでは、上書きされるか、消去されてしまう各ファイルのバックアップを作成する。 特殊な用法としては、次のものがある。force と backup の両方のオプションが指定されているとき、コピー元 (source) とコピー先 (dest) が同じ名前で、しかも実在する通常ファイルを指していると、 cp はコピー元 (source) のバックアップを作成する。 次のちょっとした Bourne シェルのスクリプトは、オプションのこの組み合わせの応用だが、便利である。

 
#!/bin/sh
# Usage: backup FILE...
# リストされた各 FILE について GNU スタイルのバックアップを
# 作成する
fail=0
for i; do
  cp --backup --force --preserve=all -- "$i" "$i" || fail=1
done
exit $fail
--copy-contents

再帰的なコピーを行っている際に、スペシャルファイル (たとえば、FIFO やデバイスファイル) の内容を、操作対象が通常ファイルであるかのようにコピーする。 要するに、コピー元の各ファイルからデータを読み込んで、それをコピー先に書き出そうとするわけである。 このオプションを使うのは、ほとんどの場合誤りである。なぜなら、 FIFO や、通常 ‘/dev’ ディレクトリにあるようなスペシャルファイルを対象にした場合、 望ましくない結果を生ずることが珍しくないからだ。 cp -R --copy-contents は、FIFO や ‘/dev/console’ のようなスペシャルファイルからデータを読み込もうとすると、 たいていの場合、いつまでも無反応になるだろうし、‘/dev/zero’ をコピーしようとすれば、コピー先のディスクを溢れさせてしまうだろう。 このオプションは、再帰的なコピーをするとき以外、効果を持たない。 また、シンボリックリンクのコピーには影響しない。

-d

シンボリックリンクをコピーする際、リンクが指しているファイルをコピーするのではなく、 シンボリックリンクをシンボリックリンクとしてコピーする。 また、コピー元において複数のファイルがハードリンクの関係にある場合、 コピー先でもその関係を維持する。 ‘--no-dereference --preserve=links’ と同じである。

-f
--force

このオプションを付けずにコピーを行う場合、 コピー先ファイルがすでに存在し、しかも書き込みモードでオープンできないと、コピーに失敗する。 それに対して、‘--force’ を付けた場合は、コピー先ファイルがオープンできないと、 cp は、まずそれを削除してから、再度オープンを試みる。 この動作は、‘--force’ と一緒に ‘--link’ や ‘--symbolic-link’ を使用した場合に行われる動作とは、違うことに注意していただきたい。 後者の場合は、すでに存在するコピー先ファイルは一度もオープンされず、 むしろ無条件で削除されるのである。‘--remove-destination’ の説明も参照すること。

このオプションは、‘--interactive’ や ‘-i’ オプションとは無関係である。どちらも他方の効果を無効にすることはない。

--no-clobber’ や ‘-n’ オプションを使用している場合、このオプションは無視される。

-H

コマンドラインの引数がシンボリックリンクを指定している場合には、 シンボリックリンクそのものではなく、それが指しているファイルをコピーする。 とは言え、再帰的にディレクトリ・ツリーをたどっているときにシンボリックに出会った場合は、 そのまま (つまり、シンボリックリンクとして) コピーする。

-i
--interactive

ディレクトリ以外のファイルをコピーする際に、コピー先ファイルがすでに存在していると、 プロンプトを出して、ファイルを上書きしてよいかどうか、ユーザに問い合わせる。 ‘-i’ オプションは、‘-n’ オプションが前にあるとき、それを無効にする。

-l
--link

コピー元がディレクトリ以外の場合、コピーする代わりに、ハードリンクを作成する。

-L
--dereference

コピー元がシンボリックリンクの場合は、その参照先をコピーする。 また、このオプションを使った場合、cp はシンボリックリンクを作ることができない。 たとえば、コピー元のディレクトリ・ツリー中に (通常ファイルに対する) シンボリックリンクがあると、コピー先のディレクトリ・ツリーには、通常ファイルとしてコピーされることになる。

-n
--no-clobber

存在するファイルを上書きしない。‘-n’ オプションは、‘-i’ オプションが前にあるとき、それを無効にする。このオプションと ‘-b’ (‘--backup’) オプションは、どちらか一方しか指定できない。

-P
--no-dereference

コピー元がシンボリックリンクの場合、それが指しているファイルをコピーするのではなく、 シンボリックリンクとしてコピーする。このオプションが作用を及ぼすのは、 コピー元のシンボリックリンクに対してだけであり、 コピー先に指定されたシンボリックリンクについては、可能なかぎり常に参照先がたどられる。

-p
--preserve[=attribute_list]

コピー元ファイルの属性のうち、指定されたものをコピー先でも維持する。 attribute_list を指定する場合は、一つ以上の以下の文字列をコンマで区切ったリストでなければならない。

mode

ファイルのモードビット (訳注: 一般にアクセス権とか、許可属性と言われるもの) やアクセス・コントロール・リストを維持する。

ownership

所有者とグループを維持する。ほとんどの最近のシステムでは、 ファイルの所有者を変更できるのは、しかるべき権限を持ったユーザだけである。 また、一般ユーザがファイルのグループを維持できるのは、 維持しようとするグループに、たまたまそのユーザが属しているときのみである。

timestamps

最終アクセス日時 (last access time) と最終更新日時 (last modification time) を、可能ならば、維持する。古いシステムでは、対象となるファイルがシンボリックリンクの場合、 そうした属性を維持することができない。 それに対して、最近のシステムでは、たいていのものが utimensat 関数を用意しているので、シンボリックリンクの場合でも、日時関係の属性維持が可能である。

links

コピー元のファイル同士が (ハードリンクであれ、シンボリックリンクであれ) リンクの関係にあるとき、コピー先の対応するファイル同士でも、その関係を維持する。 ただし、‘-L’ や ‘-H’ と一緒に使った場合、 このオプションがシンボリックリンクをハードリンクに変更することがあるのに、 注意していただきたい。一例を挙げる。

 
$ mkdir c; : > a; ln -s a b; cp -aH a b c; ls -i1 c
74161745 a
74161745 b

コピー元に注目していただきたい。‘b’ は、通常ファイル ‘a’ を指すシンボリックリンクである。 ところが、コピー先ディレクトリ ‘c/’ の二つのファイルは、ハードリンクになっている。 ‘-a’ は ‘--no-dereference’ を意味するのだから、 シンボリックリンクがコピーされそうに思えるが、この場合は、後に続く ‘-H’ が、コマンドライン引数の参照をたどるように cp に命じているので、cp には、同じ inode 番号を持った 2 個のファイルがコマンドラインで指定されているように見えるのである。 さらに、‘-a’ は ‘--preserve=links’ オプションを意味してもいるので、 この働きによって、ハードリンクと認識された両ファイルの関係が、コピー先でも維持されることになるのである。

次のものは、cp の ‘-L’ を使った場合の類似例である。

 
$ mkdir b c; (cd b; : > a; ln -s a b); cp -aL b c; ls -i1 c/b
74163295 a
74163295 b
context

ファイルの SELinux セキュリティ・コンテキストを維持する。 それができないときは、詳細なエラーメッセージを出し、失敗のステータスで終了する。

xattr

ファイルの拡張属性を維持する。それができないときは、詳細なエラーメッセージを出し、失敗のステータスで終了する。 cp が xattr のサポートなしでビルドされている場合は、このオプションは無視される。 SELinux コンテキスト、ACL、ケーパビリティなどを xattr を使って実装している場合には、 そうした属性もこのオプションによって、明示的な指定がない場合でも維持される。 すなわち、‘--preserve=mode’ や ‘--preserve=context’ を指定しないでも維持されるわけだ。

all

ファイルの属性をすべて維持する。上記のすべてを指定するのと同じことだが、 SELinux セキュリティ・コンテキストや拡張属性の維持に失敗しても、 cp の終了ステータスが変わらないという点が異なっている。 ‘-a’ とは違って、‘Operation not supported’ 以外のすべての警告メッセージを出力する。

attribute_list なしで ‘--preserve’ を使用するのは、 ‘--preserve=mode,ownership,timestamps’ と同じことである。

このオプションを使わない場合、コピー先ファイルがすでに存在している場合は、 その許可属性は変更されない。一方、新しくファイルが作成される場合は、 対応するコピー元ファイルのモードを元にして、 そこから set-user-ID ビット、set-group-ID ビット、スティッキー・ビットを落としたものが、 各ファイルに付けられ、そしてさらに、オペレーティング・システムが umask なり、デフォルトの ACL なりを適用する。 結果はより厳しいファイルモードになるかもしれない。 See section ファイルの許可属性.

--no-preserve=attribute_list

指定された属性を維持しない。attribute_list の書式は、‘--preserve’ の場合と同じである。

--parents

コピー先の各ファイル名を生成する際、出力先に指定されたディレクトリの末尾にスラッシュを付け、 その後ろにコピー元として指定されたファイル名を付け足すことによってそれを行う。 cp に渡す最後の引数は、実在するディレクトリの名前でなければならない。 一例を挙げる。

 
cp --parents a/b/c existing_dir

ファイル ‘a/b/c’ を上記のコマンドでコピーすると、ファイル ‘existing_dir/a/b/c’ が出来る。 途中のディレクトリが存在していなければ、それも作成される。

-R
-r
--recursive

ディレクトリを再帰的にコピーする。デフォルトでは、‘--link’ (‘-l’) オプションが同時に使われていないかぎり、コピー元にあるシンボリックリンクの参照をたどることをしない。 ‘--archive’ (‘-a’), ‘-d’, ‘--dereference’ (‘-L’), ‘--no-dereference’ (‘-P’), ‘-H’ などのオプションを参照。スペシャルファイルについては、 コピーする際に、コピー元ファイルと同じファイル型のコピー先ファイルを作成する。 ‘--copy-contents’ を参照。シンボリックリンクやスペシャルファイルのコピーに ‘-r’ オプションを使用するのは、どのシステムでも通用することではない。 GNU 以外のシステムの中には、歴史的な理由から ‘-r’ が、‘-L’ と ‘--copy-contents’ を同時に指定するのと等価になっているものもあるからだ。 また、シンボリックリンクをコピーするのに ‘-R’ を使用するのも、‘-P’ も併せて指定しないかぎり、どのシステムでも通用することではない。 デフォルトでシンボリックリンクの参照先をたどる実装が、POSIX で認められているからである。

--reflink[=when]

ファイルシステムがサポートしていれば、軽便コピー、すなわち、 書き込み時コピー(copy-on-write (COW) copy) を行う。 留意すべきは、これが成功した場合、コピー元とコピー先のファイルは、 どちらかに対して変更が加えられるまで、ディスクの同じデータブロックを共有しているということである。 従って、ディスク I/O エラーが起きて、片方のファイルのデータブロックが損傷を受ければ、 もう一方のファイルも同じ被害に会う。

when の値には、次のうちの一つが使える。

always

デフォルトの動作である。copy-on-write がサポートされていない場合は、 各ファイルについて失敗した旨を報告し、失敗を示すステータスで終了する。

auto

copy-on-write 操作がサポートされていない場合は、copy-on-write をあきらめて、標準のコピー動作を行う。

このオプションは、‘--link’, ‘--symbolic-link’ ‘--attributes-only’ オプションによって無効になるので、データをコピーする際の cp のデフォルト動作の設定に使用することができる。 たとえば、次のエイリアスを使うと、cp は、ファイルシステムがサポートする範囲で、 ディスクスペースの使用を最少に留めるようになる。

 
alias cp='cp --reflink=auto --sparse=always'
--remove-destination

コピー先ファイルがすでに存在する場合、その各々についてオープンを試みる前に、削除する (上述の ‘-f’ と比較すること)。

--sparse=when

穴空きファイル (sparse file) とは、穴 (holes) を含むファイルである。 穴というのは、物理的なディスクブロック上には存在しないゼロバイトの連続で、 ‘read’ システムコールがそれを読む込むとき、ゼロの連続として扱うものである。 バイナリ・ファイルには、連続するゼロバイトがたくさん含まれていることが多いので、 この仕組みは、ディスクスペースを大いに節約してくれるし、動作速度の向上をもたらしてもくれる。 デフォルトで cp は、かなり大雑把な発見的手法を使って、 コピー元ファイルにある穴を検出し、対応するコピー先ファイルも穴空きファイルにする。 なお、穴空きファイルにできるのは、通常ファイルだけである。

when の値には、次のうちの一つが使える。

auto

デフォルトの動作である。すなわち、コピー元が穴空きファイルなら、 コピー先も穴空きファイルにしようとする。 ただし、コピー先ファイルがすでに存在していても、通常ファイル以外を指している場合には、 それを穴空きにしようとはしない。

always

たとえ、コピー元ファイルが穴空きファイルに見えなくても、十分に長いゼロバイトの連続があれば、 その各々に対応する穴をコピー先ファイルに設けようとする。この動作が役に立つのは、 コピー元ファイルが、穴空きファイルをサポートしていないファイルシステムにあるのに対し (たとえば、SGI IRIX 5.3 以前の ‘efs’ ファイルシステム)、 コピー先ファイルは穴空きファイルをしっかりサポートするタイプのファイルシステムにある場合である。 穴を作ることができるのは、通常ファイルだけなので、コピー先が通常ファイル以外なら、 cp がそのファイルを穴空きにしようと試みることもない。

never

コピー先ファイルを穴空きにしない。 これは、mkswap コマンドで使用するファイルを作成するときに役に立つ。 そうしたファイルには、穴があってはならないからである。

--strip-trailing-slashes

source 引数の後ろにスラッシュが付いていたら、それを削除する。 See section 末尾のスラッシュ.

-s
--symbolic-link

コピー元がディレクトリ以外の場合、コピーする代わりに、シンボリックリンクを作成する。 出力先ファイルをカレント・ディレクトリに作成する場合を除いて、 コピー元ファイルの名前は、すべて (‘/’ で始まる) 絶対パス表記でなければならない。 シンボリックリンクをサポートしていないシステムでは、このオプションはエラーメッセージを出すだけである。

-S suffix
--suffix=suffix

-b’ によって作られる各バックアップファイルの後ろに suffix を付ける。 See section バックアップ・オプション.

-t directory
--target-directory=directory

directory を出力先ディレクトリに指定する。 See section 出力先ディレクトリ.

-T
--no-target-directory

最後のオペランドがディレクトリやディレクトリへのシンボリックリンク でも、それを特別扱いしない。 See section 出力先ディレクトリ.

-u
--update

ディレクトリ以外のものをコピーする際、それがコピー先にも存在し、 しかもその更新日時 (modification time) がコピー元と同じか、より新しい場合、 コピーを行わない。コピー元からコピー先へタイムスタンプを引き継がせている場合には、 コピー元のタイムスタンプの精度を、コピー先のファイルシステム、 及びタイプスタンプの更新に使われるシステムコールの精度に落とした上で、比較を行う。 これは、同じコピー元とコピー先のファイルに対して ‘cp -pu’ コマンドを何回か実行する場合に、余計なコピー作業が起きるのを避けるためである。 ‘--preserve=links’ が一緒に指定されている場合は (たとえば、‘cp -au’ だとそうなる)、そちらが優先されることになる。 その結果、コピー元でファイルが処理される順番によっては、 コピー元のハードリンクを反映させるために、コピー先のより新しいファイルが置き換えられることもある。

-v
--verbose

コピーを行う前に、コピーするファイル名を表示する。

-x
--one-file-system

あるファイルシステムでコピーを始めた場合、別のファイルシステムにあるサブディレクトリをスキップする。 ただし、マウントポイントのディレクトリはコピーされる。

-Z
--context[=context]

context が指定されていない場合は、出力するファイルの SELinux セキュリティ・コンテキストを、出力先におけるシステムのデフォルトのタイプに合わせて調整する。 これは、restorecon コマンドの動作に似ている。 このオプションの長い形式を使って、コンテキストを明示的に指定した場合、 そのコンテキストが設定されるのは、新しく作成されるファイルに対してのみである。 コンテキストを指定した場合に、SELinux と SMACK のどちらも無効になっていると、 警告メッセージを出す。 このオプションと ‘--preserve=context’ オプションは、どちらか一方しか指定できない。 また、このオプションは ‘--preserve=all’ や ‘-a’ オプションに優先する。

終了ステータス 0 は成功を示し、0 以外の値は失敗を示す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated on June 7, 2022 using texi2html 1.82.