【Linux】cpコマンドの使い方やオプションを詳しく解説!

Linuxを使っていると、ファイルやディレクトリをコピーしたい場面があります。

そのようなときに使用するのが、cpコマンドです。

cpコマンドを使うと、ファイルを別の名前でコピーしたり、別のディレクトリへコピーしたりできます。また、オプションを指定することで、ディレクトリをまとめてコピーしたり、ファイルの属性を保持したままコピーしたりすることも可能です。

この記事では、Linuxのcpコマンドの基本的な使い方から、よく使うオプションまで、初心者向けにわかりやすく解説します。

Linuxのcpコマンドとは?

Linuxのcpコマンドとは、ファイルやディレクトリをコピーするためのコマンドです。

cpは「copy」を意味しており、基本的にはコピー元とコピー先を指定して使用します。

例えば、sample.txtというファイルをsample_copy.txtという名前でコピーする場合は、次のように実行します。

cp sample.txt sample_copy.txt

これで、sample.txtを残したまま、sample_copy.txtという新しいファイルが作成されます。

cpコマンドの基本構文は次のとおりです。

cp [オプション] コピー元 コピー先

cpコマンドでは、コピー元のファイルは削除されません。ファイルそのものを別の場所へ移動したい場合は、cpではなくmvコマンドを使用します。

この記事では、Linuxで一般的に使用されているGNU Coreutils版のcpコマンドを前提に解説しています。

cpコマンドの使い方

ここからは、cpコマンドの基本的な使い方を順番に説明します。

ファイルをコピーする

まずは、ファイルをコピーする基本的な使い方です。

例えば、カレントディレクトリに次のファイルがあるとします。

$ ls
sample.txt

sample.txtsample_copy.txtという名前でコピーする場合は、次のコマンドを実行します。

cp sample.txt sample_copy.txt

コピー後にlsコマンドを実行すると、次のように表示されます。

$ ls
sample.txt  sample_copy.txt

元のsample.txtを残したまま、sample_copy.txtが新しく作成されていることがわかります。

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

cpコマンドでは、ファイルを別のディレクトリへコピーすることもできます。

例えば、次のようなファイルとディレクトリがあるとします。

sample.txt
backup/

sample.txtbackupディレクトリへコピーする場合は、次のように実行します。

cp sample.txt backup/

実行すると、次のようになります。

sample.txt
backup/
└── sample.txt

元のsample.txtはそのまま残り、backupディレクトリの中にもsample.txtが作成されます。

コピー先で別のファイル名にしたい場合は、次のようにファイル名まで指定します。

cp sample.txt backup/sample_copy.txt

この場合は、次のようになります。

sample.txt
backup/
└── sample_copy.txt

複数のファイルをまとめてコピーする

複数のファイルを同じディレクトリへコピーすることもできます。

例えば、次のようなファイルとディレクトリがあるとします。

file1.txt
file2.txt
file3.txt
backup/

この状態で、3つのファイルをbackupディレクトリへコピーする場合は、次のコマンドを実行します。

cp file1.txt file2.txt file3.txt backup/

実行後は次のようになります。

file1.txt
file2.txt
file3.txt
backup/
├── file1.txt
├── file2.txt
└── file3.txt

複数のファイルを指定する場合は、最後にコピー先となるディレクトリを指定します。

ディレクトリをコピーする

通常のcpコマンドでは、ディレクトリをそのままコピーすることはできません。

ディレクトリをコピーする場合は、-rまたは-Rオプションを使用します。-rは「recursive(再帰的)」を意味するオプションです。

ディレクトリの中にあるファイルだけでなく、その中にあるサブディレクトリも順番にコピーします。そのため、ディレクトリを丸ごとコピーしたい場合によく使用します。

例えば、次のようなprojectディレクトリがあるとします。

project/
├── index.html
├── style.css
└── images/
    └── logo.png

projectディレクトリをproject_backupという名前でコピーする場合は、次のように実行します。

cp -r project project_backup

コピー後は次のようになります。

project/
├── index.html
├── style.css
└── images/
    └── logo.png

project_backup/
├── index.html
├── style.css
└── images/
    └── logo.png

cpコマンドの主なオプション

cpコマンドには、コピー方法を変更するためのさまざまなオプションがあります。

主なオプションは次のとおりです。

オプション説明
-aファイル構造や属性などをできるだけ保持してコピーする
-b上書きされるファイルのバックアップを作成する
-dシンボリックリンクをたどらず、リンクとしてコピーする
-f必要に応じてコピー先を削除してからコピーを試みる
-iファイルを上書きする前に確認する
-lファイルをコピーする代わりにハードリンクを作成する
-Pシンボリックリンクをたどらず、リンク自体をコピーする
-pパーミッションや更新日時などを保持してコピーする
-r / -Rディレクトリを再帰的にコピーする
-sファイルをコピーする代わりにシンボリックリンクを作成する
-uコピー先が存在しない、またはコピー元の方が新しい場合にコピーする
-vコピーした内容を表示する

ここから、それぞれのオプションについて詳しく説明します。

cp -r:ディレクトリをコピーする

-rまたは-Rオプションを使用すると、ディレクトリを中身ごとコピーできます。

基本構文は次のとおりです。

cp -r コピー元ディレクトリ コピー先

例えば、projectディレクトリをbackupディレクトリへコピーする場合は、次のように実行します。

cp -r project backup/

backupディレクトリがすでに存在している場合は、その中にprojectディレクトリがコピーされます。

backup/
└── project/
    ├── index.html
    └── style.css

一方、project_backupが存在しない場合は、次のコマンドを実行します。

cp -r project project_backup

このコマンドを実行すると、project_backupという名前のディレクトリが新しく作成されます。

ディレクトリをコピーするときによく使用するオプションです。

cp -i:上書きする前に確認する

通常のcpコマンドでは、コピー先に同じ名前のファイルが存在すると、そのファイルが上書きされることがあります。

誤って大切なファイルを上書きしたくない場合は、-iオプションが便利です。

cp -i sample.txt backup/sample.txt

コピー先にsample.txtがすでに存在する場合、上書きするか確認するメッセージが表示されます。

cp: overwrite 'backup/sample.txt'?

上書きする場合はy、上書きしない場合はnを入力します。

重要なファイルを手動でコピーするときに便利なオプションです。

cp -v:コピーした内容を表示する

-vオプションを使用すると、どのファイルがどこへコピーされたのかを画面に表示できます。

cp -v sample.txt backup/

実行結果は次のようになります。

'sample.txt' -> 'backup/sample.txt'

複数のファイルやディレクトリをコピーするときに、処理内容を確認したい場合に便利です。

-rと組み合わせる場合は、次のように実行します。

cp -rv project backup/

このように、複数のオプションを組み合わせて使用することもできます。

cp -p:ファイルの属性を保持してコピーする

-pオプションを使用すると、ファイルのパーミッション、所有者・グループ、更新日時などを可能な範囲で保持してコピーします。

cp -p sample.txt backup/

例えば、ファイルの更新日時を維持したままコピーしたい場合などに使用します。

ただし、実行するユーザーの権限によっては、所有者など一部の属性を保持できない場合があります。

cp -a:属性などをできるだけ保持してコピーする

-aオプションは、ファイルやディレクトリの構造や属性などをできるだけ保持したままコピーするときに使用します。

cp -a project project_backup

-aは「archive」を意味します。この指定によって、再帰的なコピーや属性の保持などをまとめて行えます。

そのため、ディレクトリを再帰的にコピーするだけでなく、パーミッションや更新日時、シンボリックリンクなどもできるだけ元の状態のまま維持します。

単純にディレクトリをコピーする場合は-r、属性などもできるだけ維持したい場合は-aと覚えておくとわかりやすいでしょう。

  • cp -r:ディレクトリを中身ごとコピーする
  • cp -a:ディレクトリを中身ごとコピーしつつ、パーミッション・更新日時・シンボリックリンクなどもできるだけ保持する

cp -u:コピー先がない、またはコピー元の方が新しい場合にコピーする

-uオプションを使用すると、コピー先のファイルが存在しない場合、またはコピー元のファイルの方が新しい場合にコピーします。

cp -u sample.txt backup/

例えば、コピー元とコピー先の更新時刻が次のような場合を考えます。

コピー元 sample.txt   10:00更新
コピー先 sample.txt    9:00更新

この場合は、コピー元の方が新しいためコピーされます。

一方、コピー先の方が新しい場合は次のようになります。

コピー元 sample.txt    9:00更新
コピー先 sample.txt   10:00更新

この場合は、コピー先の方が新しいためコピーされません。

すでにコピーしたファイルを必要以上に上書きしたくない場合などに便利です。

ディレクトリをコピーするときは、次のように-rと組み合わせることもできます。

cp -ru project backup/

cp -b:上書き前のファイルをバックアップする

-bオプションを使用すると、コピー先に同じ名前のファイルが存在する場合、上書き前のファイルのバックアップを作成します。

cp -b sample.txt backup/sample.txt

例えば、backup/sample.txtがすでに存在する場合、通常は次のようなバックアップファイルが作成されます。

sample.txt
sample.txt~

既存ファイルを残したうえで新しいファイルをコピーしたい場合に便利です。

cp -f:必要に応じてコピー先を削除してコピーする

-fオプションは「force」を意味します。

cp -f sample.txt backup/sample.txt

コピー先のファイルを通常の方法で開けない場合などに、必要に応じてコピー先を削除してからコピーを試みます。

ただし、-fを付ければどのようなファイルでも必ず上書きできるわけではありません。ファイルやディレクトリのパーミッションなどによっては、コピーできない場合があります。

また、単純に「確認メッセージを出さずに必ず上書きするオプション」という意味ではない点にも注意しましょう。

cp -d:シンボリックリンクをそのままコピーする

-dオプションを使用すると、シンボリックリンクの参照先をたどらず、シンボリックリンクそのものをコピーします。

例えば、original.txtを参照するlink.txtというシンボリックリンクがあるとします。

link.txt -> original.txt

次のようにコピーします。

cp -d link.txt link_copy.txt

すると、original.txtの内容を持つ通常のファイルではなく、link_copy.txtもシンボリックリンクとして作成されます。

link_copy.txt -> original.txt

また、-dには、コピー元にハードリンクの関係がある場合、その関係をできるだけ保持する働きもあります。

なお、-dだけではディレクトリを中身ごとコピーできません。ディレクトリをコピーする場合は、-r-Rと組み合わせます。

cp -rd project backup/

cp -P:シンボリックリンクをたどらない

-Pオプションも、シンボリックリンクの参照先をたどらず、リンクそのものをコピーするためのオプションです。

cp -P link.txt link_copy.txt

この場合も、link_copy.txtは通常のファイルではなく、シンボリックリンクとして作成されます。

link_copy.txt -> original.txt

-d-Pは似ていますが、違いはハードリンクの扱いです。

  • -P:シンボリックリンクをたどらず、そのままコピーする
  • -d-Pと同じ動作に加えて、ハードリンクの関係もできるだけ保持する

そのため、シンボリックリンクだけを考えると、-d-Pの動作はほぼ同じです。

なお、-Pにもディレクトリを再帰的にコピーする機能はありません。ディレクトリをコピーする場合は、-r-Rと組み合わせて使用します。

cp -rP project backup/

cp -l:ハードリンクを作成する

-lオプションを指定すると、通常のコピーを作成する代わりにハードリンクを作成します。

例えば、次のように実行します。

cp -l original.txt hardlink.txt

通常のcpでは、コピー元とは独立した新しいファイルが作成されます。

一方、-lを指定すると、original.txthardlink.txtは同じファイルの実体を参照するハードリンクになります。

そのため、通常の「ファイルを複製する」という動作とは異なります。

cp -s:シンボリックリンクを作成する

-sオプションを指定すると、ファイルを実際にコピーする代わりにシンボリックリンクを作成します。

例えば、次のコマンドを実行します。

cp -s original.txt link.txt

このコマンドを実行すると、original.txtへのシンボリックリンクとしてlink.txtが作成されます。

イメージすると次のようになります。

link.txt -> original.txt

-lがハードリンクを作成するのに対して、-sはシンボリックリンクを作成します。

-sで相対パスを指定して別のディレクトリにリンクを作成すると、リンク先が意図した場所を指さない場合があります。なお、シンボリックリンクを作成する場合は、cp -sよりもln -sコマンドがよく使用されます。

-d・-P・-sの違い

-d-P-sはすべてシンボリックリンクに関係するため、初心者には少しわかりにくいオプションです。

簡単に整理すると、次のようになります。

オプション主な役割
-dシンボリックリンクをたどらず、リンクとしてコピーする。さらにハードリンク関係も保持する
-Pシンボリックリンクをたどらず、リンクとしてコピーする
-sファイルをコピーする代わりに、新しいシンボリックリンクを作成する

-d-Pは「すでに存在しているシンボリックリンクをコピーするときの扱い」に関係します。-d-Pに加えて、コピー元ファイル間のハードリンク関係も保持します。

一方、-sは「通常のコピーではなく、新しいシンボリックリンクを作る」という違いがあります。

通常のファイルコピーだけを行う場合は、これらのオプションを無理に覚える必要はありません。

cpコマンドで上書きするときの注意点

cpコマンドを使用するときに特に注意したいのが、既存ファイルの上書きです。

例えば、次のコマンドを実行します。

cp new.txt important.txt

このとき、important.txtがすでに存在すると、その内容がnew.txtの内容で上書きされる可能性があります。

基本的に、一度上書きしてしまったファイルをcpコマンドだけで元に戻すことはできません。

重要なファイルをコピーするときは、-iを使用して上書き前に確認できます。

cp -i new.txt important.txt

-bを使用すれば、上書き前のファイルをバックアップすることもできます。

cp -b new.txt important.txt

重要なファイルを扱う場合は、これらのオプションを使うと誤操作を防ぎやすくなります。

また、コマンドを実行する前に、lsls -lを使用してコピー元とコピー先のファイルを確認するのもおすすめです。

cpコマンドでよく使うオプションの組み合わせ

cpコマンドのオプションは、複数を組み合わせて使用できます。

例えば、ディレクトリをコピーしながら、コピーしたファイルを表示する場合は次のようにします。

cp -rv project backup/

-rはディレクトリを再帰的にコピーし、-vはコピーした内容を表示します。

上書き前に確認しながらコピー内容も表示する場合は、次のようにします。

cp -iv sample.txt backup/

ディレクトリの属性などをできるだけ維持しながら、コピー内容も確認したい場合は次のようにします。

cp -av project backup/

最初からすべてのオプションを覚える必要はありません。

まずは、次の基本的な使い方から覚えておくとよいでしょう。

  • cp
  • cp -r
  • cp -i
  • cp -v
  • cp -a

これらを覚えておけば、基本的なファイルやディレクトリのコピーに対応できます。

-d-P-l-sなどは、シンボリックリンクやハードリンクを扱う必要が出てきたときに覚えるとよいでしょう。

本記事のまとめ

この記事では「Linuxのcpコマンド」について、以下の内容を説明しました。

  • cpコマンドは、ファイルやディレクトリをコピーするためのコマンド
  • 基本構文はcp [オプション] コピー元 コピー先
  • ディレクトリをコピーするときは-rまたは-Rを使用する
  • -iを使用すると、既存ファイルを上書きする前に確認できる
  • -aを使用すると、属性やシンボリックリンクなどをできるだけ保持してコピーできる
  • -l-sを使用すると、コピーの代わりにハードリンクやシンボリックリンクを作成できる

cpコマンドは、Linuxでファイルを操作するときによく使用する基本的なコマンドです。

すべてのオプションを最初から覚える必要はありません。まずは通常のcpと、ディレクトリをコピーする-r、上書きを確認する-iなど、よく使うものから覚えていくとよいでしょう。

お読みいただきありがとうございました。

スポンサーリンク