cp

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

cp - ファイルやディレクトリをコピーする
cp [ options ] file path cp [ options ] file... directory
POSIX オプション: [-fipRr]
GNU オプション (簡略形式): [-abdfilprsuvxHLPR] [-S SUFFIX ] [-V {numbered,existing,simple}] [--remove-destination] [--sparse= WHEN ] [--strip-trailing-slashes] [--target-directory= DIR ] [--help] [--version] [--]
cp はファイル (あるいはそのように指定すればディレクトリ) をコピーする。 1 つのファイルを指定先にコピーしたり、 複数のファイルを指定ディレクトリにコピーしたりできる。 最後の引き数が既に存在するディレクトリを指している場合、 cp はコピー元の file をそれぞれ (同じ名前のまま) そのディレクトリにコピーする。 2 つのファイルだけが指定された場合、 1 つ目のファイルを 2 つ目のファイルにコピーする。 最後の引き数がディレクトリでなく、 2 つ以上のオプションでない引き数が与えられた場合はエラーになる。 (したがって `cp -r /a /b' とすると、 /b が存在する場合は /a を /b/a に、 /a/x を /b/a/x にコピーする。しかしコピー前に /b がない場合は /a を /b に、/a/x を /b/x にコピーする。) 作られたファイルとディレクトリのモードは、 まずオリジナルファイルのモードと同じものにされ、 0777 との AND をとられ、 ユーザーの umask のビットが引かれる (-p オプションが指定された場合を除く)。 (しかし再帰コピーの最中には、新しく作られたディレクトリの最終モードに、 一時的に S_IRWXU (0700) が OR される。 こればプロセスがこれらの新しく作られたディレクトリの 読み出し・書き込み・検索のプロセスを可能にするためである。) ファイルをそれ自身にコピーしようとした場合、 (エラーメッセージを出す以外は) 何もしない。 既存のファイルにコピーする場合、 コピー先のファイルは `open(path, O_WRONLY | O_TRUNC)' で開かれる。 新規ファイルにコピーする場合、 新規ファイルは `open(path, O_WRONLY | O_CREAT, mode)' で作成される。 コピー先のファイルが存在し、かつ -f オプションが与えられている場合に この形式でのファイルのオープンに失敗すると、 cp は既存のファイルの削除 (もしくはアンリンク) を試みる。 そして、削除に成功した場合は新規ファイルへのコピーとして 命令を続行する。 再帰的にコピーする場合、 デフォルトでは cp はシンボリックリンクを辿るだけである (-dHL オプションを参照)。
POSIX では、以下のオプションを認識する。
-f
必要であれば、既存のコピー先のファイルを削除する (上記参照)。
-H
コマンドラインで指定された全てのシンボリックリンクを辿る。
-i
コピー先に既に存在するファイルを上書きするかを問い合わせてくる。 (問い合わせは標準エラーに書かれ、返答は標準入力から読まれる。 上書きを肯定する返答があった場合のみコピーされる。)
-L
シンボリックリンクを辿り、 それが指しているファイルをコピーまたは上書きする。
-p
オリジナルファイルの所有者・グループ・アクセス権・アクセス時刻を保存する (以下の --preserve を参照)。
-R
ディレクトリを再帰的にコピーし、 一般のファイルでもなくディレクトリでもないものに対しては それに相応したコピーをする。 (たとえば FIFO とスペシャルファイルのコピーは、 それぞれ FIFO とスペシャルファイルにされる。)
-r
ディレクトリを再帰的にコピーするが、 一般のファイルでもなくディレクトリでもないものに 対してどうするかは規定されていない。 (したがって -r オプションを -R オプションの 単なる別名にすることも可能である (実は推奨されている)。 しかし、現在の GNU 版の cp のような単純な動作 (下記参照) も禁止されていない。)
通常、ファイルは読まれた通りに書き出される。 --sparse オプションの場合は例外であるので下記を参照すること。 デフォルトでは、`cp' はディレクトリのコピーを行わない (以下の -r オプションを見よ)。 cp はファイルのそれ自身へのコピーを通常は拒否するが、 次のような例外がある: --force --backup が指定されていて、 コピー元コピー先 が同一で、通常のファイルを参照している場合には、 cp はバックアップファイルを作る。 バックアップファイル名には通常または番号付きの拡張子が、 通常の場合と同じように付く。 これは、既に存在するファイルを変更前に 単純にバックアップしたい場合に有用である。
-a, --archive
コピー先で、できる限り元のファイルの構成と属性を保持する (ディレクトリ構造体は保存しない)。 -dpR と同じ。
-d, --no-dereference
シンボリックリンクをコピーする場合、シンボリックリンクが指している ファイルをコピーするのではなく、シンボリックリンクとしてコピーする。 また、コピー元でのハードリンクはコピー先でもハードリンクとして保持される。
-f, --force
コピー先のファイルを書き込みまたはアンリンクするため、 ファイルをオープンしようとする。 失敗した場合、途中で中止することなくデフォルトの動作を行う。 --remove-destination を参照。
-i, --interactive
コピー先に上書きされる通常のファイルが存在する場合、 上書きの可否を問い合わせてくる。
-l, --link
コピーする代わりにハードリンクを作る (ただし、ディレクトリ以外)。
-L, --dereference
シンボリックリンクを辿り、 それが指しているファイルをコピーまたは上書きする。
-p, --preserve
オリジナルファイルの所有者・グループ・ アクセス権 (setuid, setgid ビットを含む)・ 最終修正時刻・最終アクセス時刻を保存する。 所有者やグループの複製に失敗した場合には、 setuid ビットと setgid ビットはクリアされる。 (この場合コピー元とコピー先の最終アクセス時刻が異なってしまうことに注意。 コピー操作はコピー元ファイルへのアクセスであるから。)
-P, --parents
コピー先のファイル名の作り方を 「コピー先ディレクトリにスラッシュ (/) とコピー元ファイルの名前を加える」 とする。 cp の最後の引き数は既に存在するディレクトリでなければならない。 たとえば、
cp --parents a/b/c existing_dir

というコマンドは `a/b/c'というファイルを `existing_dir/a/b/c' に (途中のディレクトリがない場合は それも作って) コピーする。
-r
ディレクトリを再帰的にコピーする。(FIFO やスペシャルファイルといった) ディレクトリでもなくシンボリックリンクでもないものを 通常のファイルとしてコピーする。 この場合 cp はコピー元ファイルからデータが読み込み、 コピー先に書き出そうとする。よくある間違いは、 `cp -r' をスペシャルファイル、 FIFO、`/dev' ディレクトリ以下にあるものに対して使うことである。 多くの場合、cp は FIFO や `/dev/console' といった スペシャルファイルから読み込もうとして永久にハングしたり、 `/dev/zero' をコピーしようとしてコピー先ディスクを溢れさせたり、 不明なディバイスを開いてハードウェアによくわからない効果を 及ぼしてしまったりする。 スペシャルファイルの内容をコピーするのでなく、 スペシャルファイルをその特性を保持したままコピーしたい場合は、 --recursive または -R オプションを使うこと。
--remove-destination
ファイルを書き込みオープンするのではなく、アンリンクする。 --force を参照。
-R, --recursive
ディレクトリでないものを保存しつつ、 ディレクトリを再帰的にコピーする (すぐ上の -r オプションを見よ)。
--sparse= WHEN
「スパースなファイル」とは「ホール( 穴 )」 (物理ディスクブロックを占有しないゼロバイトの連続) を含むものである。 read システムコールはそれらのファイルをゼロとして読み込む。 多くのバイナリファイルにはゼロバイトの並びがたくさん含まれているので、 このオプションにより、かなりのディスク容量を節約し、 スピードを上げることができる。 デフォルトでは `cp' は大雑把な発見的手法で 入力されたコピー元ファイルからホールを検知し、 対応する出力ファイルもスパースにする。 WHEN の値は下のいずれかである:
auto
デフォルトの動作:入力ファイルがスパースのとき、 出力ファイルもスパースにする。
always
常に出力ファイルをスパースにする。このオプションは入力ファイルが スパースなファイルをサポートしないファイルシステム上にあるが、 出力ファイルはスパースなファイルをサポートするファイルシステム上に 置かれる場合に有用である。
never
出力ファイルをスパースにしない。 このオプションの有意義な利用法を見付けたら筆者に教えてほしい。
--strip-trailing-slashes
指定された全ての引き数について、 後ろに付いているスラッシュを取り除く。 これは `mkdir a; ln -s a la; mv la/ b' のような場合に役立つ。 この場合 POSIX の命令では、 mv はシンボリックリンク `la' ではなく ディレクトリ `a' を実際に移動してしまう。
-s, --symbolic-link
ディレクトリ以外のファイルに対して、コピーするかわりに シンボリックリンクを作る。シンボリックリンクファイルを カレントディレクトリに作る場合を除き、 コピー元ファイル名は ('/' で始まる) 絶対パスでなければならない。 シンボリックリンクをサポートしていないシステムでは、 このオプションは単にエラーメッセージを出力するだけである。
--target-directory= DIR
コピー先ディレクトリを、コマンドラインの最後の引き数ではなく、 オプションで指定する。 xargs(1) と一緒に用いると便利。
-u, --update
ディレクトリ以外のファイルのコピーで、 コピー先ファイルが既に存在し、 修正時刻がコピー元と同じかより新しい場合、 コピーを行わない。
-v, --verbose
コピーする前にそれぞれのファイル名を出力する。 また名前を変更する際のバックアップファイル名も表示する。
-x, --one-file-system
コピーを始めたディレクトリと 異なるファイルシステム上にあるサブディレクトリをコピーをしない。 マウントポイントは同じファイルシステム上にあるのでコピーされる。
GNU 版のプログラム cp , mv , ln , install , patch は、上書き、修正、削除といった場合に、指示すればファイルの バックアップを作成する。 バックアップファイルを必要とする場合は -b オプションで指定する。 どのような名前にするかは --backup オプションで指定する。 バックアップファイルの名前を、ファイル名に拡張子を追加する形で 与えるようにしたい場合、 この拡張子を -S オプションで指示する。
-b, --backup[= METHOD ]
上書きもしくは削除の必要がある場合には、 ファイルのバックアップを作成する。 -b は引き数を取らない点に注意すること。
-S SUFFIX , --suffix= SUFFIX
SUFFIX をバックアップファイルそれぞれに付け加える。 このオプションが指定されていない場合、環境変数 SIMPLE_BACKUP_SUFFIX に設定されている値が使われる。 SIMPLE_BACKUP_SUFFIX が設定されていない場合の標準値は `~' である。
-V METHOD , --version-control= METHOD
バックアップファイルの命名方法を指定する。 引き数 METHOD には、`numbered' (または `t')、`existing' (または `nil')、 `never' (または `simple') を指定できる。 このオプションが指定されていない場合、環境変数 VERSION_CONTROL の値が使われる。 VERSION_CONTROL が設定されていない場合の標準値は `existing' である。 このオプションは Emacs 変数の `version-control' に対応している。 有効な METHOD は (他と重複しない短縮形が使える):
t , numbered
常に番号の拡張子を持つバックアップが作られる。
nil , existing
番号の拡張子を持つバックアップがすでにある場合には 番号の拡張子を持つバックアップを、 そうでない場合には単純なバックアップを作成する。
never , simple
常に単純なバックアップが作られる。 このオプションは推奨されない。 代りに --backup=METHOD を使うこと。
--help
標準出力に使用方法のメッセージを出力して正常終了する。
--version
標準出力にバージョン情報を出力して正常終了する。
--
オプションリストの終りを示す。
変数 LANG, LC_ALL, LC_CTYPE, LC_MESSAGES が通常の意味を持つ。 GNU 版では、変数 SIMPLE_BACKUP_SUFFIX と VERSION_CONTROL が バックアップファイルの命名法を上で説明した方法で管理する。
POSIX 1003.2
このページは fileutils-4.1 パッケージの cp コマンドについて説明したものである; その他のバージョンでは少し違いがあるかもしれない。 修正や追加は aeb@cwi.nl, aw@mail1.bet1.puv.fi, ragnar@ragnar-hojland.com 宛にメールで連絡してください。 プログラムのバグについては bug-fileutils@gnu.org へ報告してください。