Linuxコマンドcpの使い方と7つのオプション

Linux環境でファイルやディレクトリをコピーする際に使用する代表的なコマンドが cp です。このポスティングでは、Linuxコマンドcpの基本的な使い方から、さまざまなオプションと活用例まで詳しく見ていきます。

Linuxコマンドcpとは?

cp は「copy」の略で、ファイルやディレクトリをコピーする際に使用されます。このコマンドを使用すると、元のファイルやディレクトリをそのままコピーして、別の場所に同じ内容のファイルやディレクトリを作成できます。

基本的な使い方

Linuxコマンド cp の基本的な使い方は次のとおりです:

cp [オプション] 元ファイル 先ファイル
ShellScript

例えば、file1.txtfile2.txt にコピーするには次のように入力します:

cp file1.txt file2.txt
ShellScript

便利なオプション

cp コマンドにはさまざまなオプションがあります。ここでは、よく使用されるいくつかのオプションを紹介します。

-rオプション(recursive):サブディレクトリのコピー

-rオプションは、 cp コマンドで最もよく使用されるオプションと言っても過言ではありません。サブディレクトリやファイルをすべてコピーするには、-r(再帰的)オプションを使用する必要があります。次のコマンドは、linux ディレクトリを linux2 ディレクトリにコピーします:

cp -r linux linux2
ShellScript

-rオプションを使用しないとディレクトリ自体がコピーされず、下の図のように「cp: -r not specified; omitting directory ‘linux’」というメッセージが表示されて、-rオプションの使用を促します。

図1. Linuxコマンドcpでディレクトリのコピーに失敗する場合
図1. Linuxコマンドcpでディレクトリのコピーに失敗する場合

-iオプション(interactive):上書き警告

基本的に cp コマンドは、先ファイルが既に存在する場合、警告なしで上書きします。重要なファイルを誤って上書きするのを防ぐために、-i(対話的)オプションを使用して確認メッセージを表示することができます。

cp -i file1.txt file2.txt
ShellScript

下の図では、a5.txta2.txt にコピーしようとすると、既に a2.txt ファイルが存在するため、上書きするかどうかを尋ねられます。ここで y を押すと上書きが実行され、n を押すとコピーされません。

図2. Linuxコマンド cp -iオプションで上書きを確認
図2. Linuxコマンド cp -iオプションで上書きを確認

-vオプション(verbose):詳細な内容を表示

-vオプションを使用すると、コピー過程の詳細な内容が表示されます。これにより、コピー過程で発生する問題を簡単に確認できます。

cp -v file1.txt file2.txt
ShellScript

~/linux にある .txt 拡張子のファイルを現在のディレクトリにコピーした結果です。c.txt ファイルは読み取り権限がないため、コピーできなかったことがわかります。-vオプションを使用しなくても c.txt ファイルがコピーされなかったことはわかりますが、他のファイルがどのようにコピーされたかはわかりません。

図3. Linuxコマンドcp -vオプションで詳細なコピー内容を表示
図3. Linuxコマンドcp -vオプションで詳細なコピー内容を表示

-uオプション(update):最新のファイルのみコピー

-uオプションは、先ファイルが元ファイルより古い場合にのみコピーします。これにより、不必要なコピーを減らすことができます。-vオプションと併用すると、どのファイルが更新されたかを確認できます。

cp -u file1.txt file2.txt
ShellScript

今回は -u オプションを -v オプションと一緒に使用しました。 cp コマンドは基本的にどのファイルがコピーされたかについてメッセージで知らせないため、-v オプションを使用しないとファイルが更新されたかどうかわかりません。

以下を見ると、h.txt ファイルが j.txt より古いため j.txt ファイルにコピーされたことがわかります。しかし a.txtj.txt より古くないためコピーされなかったことも確認できます。

図4. Linuxコマンドcp -uオプションで最新のファイルのみコピー
図4. Linuxコマンドcp -uオプションで最新のファイルのみコピー

-pオプション(preserve):権限/所有権のコピー

Linuxでファイルをコピーする際に、ファイルの権限(permission)や所有権(ownership)も重要な場合があります。基本的に cp コマンドはファイルの内容だけをコピーし、権限と所有権はデフォルト設定が適用されます。しかし、-p オプションを使用すると元ファイルの権限と所有権を保持したままコピーできます。

sudo cp -p file1.txt file2.txt
ShellScript

以下の図は /usr/bin/mount ファイルをオプションなしでコピーした結果、-p オプションを使用して mount2 にコピーした結果、および sudo コマンドと -p オプションを使用して mount3 にコピーした結果です。

chown コマンドでファイルの所有権を設定する際に sudo コマンドが必要なように、 cp -p を使用するには sudo を併用する必要があることがわかります。

図5. Linuxコマンドcp -pオプションで権限/所有権をコピー
図5. Linuxコマンドcp -pオプションで権限/所有権をコピー

-Lオプション(リンク):ハードリンク

基本的に cp コマンドを使用してコピーすると、シンボリックリンクはシンボリックリンクとしてコピーされます。しかし、シンボリックリンクではなく、対応するディレクトリの実際の内容をコピーしたい場合は -L オプションを使用してコピーできます。このコマンドはサブディレクトリをコピーする機能なので -r オプションと併用する必要があります。

cp -rL sym_link real_dir
ShellScript

以下の例では、シンボリックリンク shots に含まれる実際のファイルを shots2 ディレクトリにコピーしました。

図6. Linuxコマンドcp -Lオプションでシンボリックリンクの実際の内容をコピー
図6. Linuxコマンドcp -Lオプションでシンボリックリンクの実際の内容をコピー

以下の図で、シンボリックリンクとしてコピーされず、実際のディレクトリとしてコピーされたことが確認できます。

図7. Linuxコマンドcp -Lオプションでシンボリックリンクの実際の内容コピー結果を確認
図7. Linuxコマンドcp -Lオプションでシンボリックリンクの実際の内容コピー結果を確認

–backupオプション:バックアップファイルの作成

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

cp --backup file1.txt file2.txt
ShellScript

バックアップオプションを使用すると、以下の図のように既存のファイル名の後にチルダ(~)が付加されて a.txt~ ファイルとしてバックアップされ、コピーされるファイルはファイル名そのままに a.txt としてコピーされます。

図8. Linuxコマンドcp --backupオプションで同じ名前のファイルをバックアップ
図8. Linuxコマンド cp –backupオプションで同じ名前のファイルをバックアップ

注意事項

ファイル名の空白

特定のファイル名をコピーする際に特殊文字やスペース(空白)が含まれている場合、引用符で囲んで使用することをお勧めします。そうしないと予期しない結果が生じることがあります。

以下の場合がその例です。a.txt ファイルと My ファイルを Home ディレクトリにコピーするコマンドですが、My という名前のファイルがないため、エラーメッセージが表示されます。

図9. Linuxコマンドcp使用時、ファイル名に空白がある場合に引用符で囲まない例
図9. Linuxコマンド cp使用時、ファイル名に空白がある場合に引用符で囲まない例

したがってしたがって、以下のように引用符で囲んでファイル名を使用する必要があります。そうすると、意図した通りに My Home ファイルとしてコピーできます。

図10. Linuxコマンドcp使用時、ファイル名に空白がある場合に引用符で囲んで処理する例
図10. Linuxコマンド cp使用時、ファイル名に空白がある場合に引用符で囲んで処理する例

ファイルのパーミッション問題

時折、ファイルに対する権限がなくてもコピーしなければならない場合があります。そのような場合には、sudo コマンドを使用してコピーしてください。

以下の図では、c.txt ファイルは root ユーザーのみに読み取り権限があります。そのため、ユーザー ito はアクセス権限がなく、ファイルをコピーできません。このような場合には sudo コマンドを使用してコピーできます。

図11. Linuxコマンドcp使用時、sudoコマンドを利用してコピーする例
図11. Linuxコマンド cp使用時、sudoコマンドを利用してコピーする例

複数のオプション

複数のオプションを同時に適用する必要がある場合、一緒に書くと便利です。例えば、-r オプションと -L オプションを一緒に使用する場合、先に述べた -L オプションの内容のように -rL と一緒に使用できます。もちろん、-r -L と個別に書いても構いません。

まとめ

Linuxコマンド cp はファイルとディレクトリをコピーするための必須ツールです。基本的な使い方からさまざまなオプションを活用して有効に利用することができ、他のツールと組み合わせて効率的な作業環境を構築できます。さらに疑問や詳細を知りたいことがあれば、いつでも質問してください!

このポスティングが皆さんのLinux活用に役立つことを願っています。

リファレンス

関連ポスト

コメントする