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.txtsample.txtをsample_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.txtをbackupディレクトリへコピーする場合は、次のように実行します。
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.pngprojectディレクトリをproject_backupという名前でコピーする場合は、次のように実行します。
cp -r project project_backupコピー後は次のようになります。
project/
├── index.html
├── style.css
└── images/
└── logo.png
project_backup/
├── index.html
├── style.css
└── images/
└── logo.pngcpコマンドの主なオプション
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.txtとhardlink.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重要なファイルを扱う場合は、これらのオプションを使うと誤操作を防ぎやすくなります。
また、コマンドを実行する前に、lsやls -lを使用してコピー元とコピー先のファイルを確認するのもおすすめです。
cpコマンドでよく使うオプションの組み合わせ
cpコマンドのオプションは、複数を組み合わせて使用できます。
例えば、ディレクトリをコピーしながら、コピーしたファイルを表示する場合は次のようにします。
cp -rv project backup/-rはディレクトリを再帰的にコピーし、-vはコピーした内容を表示します。
上書き前に確認しながらコピー内容も表示する場合は、次のようにします。
cp -iv sample.txt backup/ディレクトリの属性などをできるだけ維持しながら、コピー内容も確認したい場合は次のようにします。
cp -av project backup/最初からすべてのオプションを覚える必要はありません。
まずは、次の基本的な使い方から覚えておくとよいでしょう。
cpcp -rcp -icp -vcp -a
これらを覚えておけば、基本的なファイルやディレクトリのコピーに対応できます。
-d、-P、-l、-sなどは、シンボリックリンクやハードリンクを扱う必要が出てきたときに覚えるとよいでしょう。
本記事のまとめ
この記事では「Linuxのcpコマンド」について、以下の内容を説明しました。
cpコマンドは、ファイルやディレクトリをコピーするためのコマンド- 基本構文は
cp [オプション] コピー元 コピー先 - ディレクトリをコピーするときは
-rまたは-Rを使用する -iを使用すると、既存ファイルを上書きする前に確認できる-aを使用すると、属性やシンボリックリンクなどをできるだけ保持してコピーできる-lや-sを使用すると、コピーの代わりにハードリンクやシンボリックリンクを作成できる
cpコマンドは、Linuxでファイルを操作するときによく使用する基本的なコマンドです。
すべてのオプションを最初から覚える必要はありません。まずは通常のcpと、ディレクトリをコピーする-r、上書きを確認する-iなど、よく使うものから覚えていくとよいでしょう。
お読みいただきありがとうございました。