Linux環境でファイルやディレクトリをコピーする際に使用する代表的なコマンドが cp
です。このポスティングでは、Linuxコマンドcpの基本的な使い方から、さまざまなオプションと活用例まで詳しく見ていきます。
目次
Linuxコマンドcp
とは?
cp は「copy」の略で、ファイルやディレクトリをコピーする際に使用されます。このコマンドを使用すると、元のファイルやディレクトリをそのままコピーして、別の場所に同じ内容のファイルやディレクトリを作成できます。
基本的な使い方
Linuxコマンド cp
の基本的な使い方は次のとおりです:
cp [オプション] 元ファイル 先ファイル
ShellScript例えば、file1.txt
を file2.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オプションの使用を促します。

cp
でディレクトリのコピーに失敗する場合-iオプション(interactive):上書き警告
基本的に cp
コマンドは、先ファイルが既に存在する場合、警告なしで上書きします。重要なファイルを誤って上書きするのを防ぐために、-i(対話的)オプションを使用して確認メッセージを表示することができます。
cp -i file1.txt file2.txt
ShellScript下の図では、a5.txt
を a2.txt
にコピーしようとすると、既に a2.txt
ファイルが存在するため、上書きするかどうかを尋ねられます。ここで y
を押すと上書きが実行され、n
を押すとコピーされません。

cp
-iオプションで上書きを確認-vオプション(verbose):詳細な内容を表示
-vオプションを使用すると、コピー過程の詳細な内容が表示されます。これにより、コピー過程で発生する問題を簡単に確認できます。
cp -v file1.txt file2.txt
ShellScript~/linux にある .txt 拡張子のファイルを現在のディレクトリにコピーした結果です。c.txt ファイルは読み取り権限がないため、コピーできなかったことがわかります。-vオプションを使用しなくても c.txt ファイルがコピーされなかったことはわかりますが、他のファイルがどのようにコピーされたかはわかりません。

-uオプション(update):最新のファイルのみコピー
-uオプションは、先ファイルが元ファイルより古い場合にのみコピーします。これにより、不必要なコピーを減らすことができます。-vオプションと併用すると、どのファイルが更新されたかを確認できます。
cp -u file1.txt file2.txt
ShellScript今回は -u
オプションを -v
オプションと一緒に使用しました。 cp
コマンドは基本的にどのファイルがコピーされたかについてメッセージで知らせないため、-v
オプションを使用しないとファイルが更新されたかどうかわかりません。
以下を見ると、h.txt
ファイルが j.txt
より古いため j.txt
ファイルにコピーされたことがわかります。しかし a.txt
は j.txt
より古くないためコピーされなかったことも確認できます。

-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 を併用する必要があることがわかります。

-Lオプション(リンク):ハードリンク
基本的に cp
コマンドを使用してコピーすると、シンボリックリンクはシンボリックリンクとしてコピーされます。しかし、シンボリックリンクではなく、対応するディレクトリの実際の内容をコピーしたい場合は -L
オプションを使用してコピーできます。このコマンドはサブディレクトリをコピーする機能なので -r
オプションと併用する必要があります。
cp -rL sym_link real_dir
ShellScript以下の例では、シンボリックリンク shots
に含まれる実際のファイルを shots2
ディレクトリにコピーしました。

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

–backupオプション:バックアップファイルの作成
–backupオプションを使用すると、同じ名前のファイルが存在する場合、上書きする前にバックアップファイルを作成します。
cp --backup file1.txt file2.txt
ShellScriptバックアップオプションを使用すると、以下の図のように既存のファイル名の後にチルダ(~
)が付加されて a.txt~
ファイルとしてバックアップされ、コピーされるファイルはファイル名そのままに a.txt
としてコピーされます。

注意事項
ファイル名の空白
特定のファイル名をコピーする際に特殊文字やスペース(空白)が含まれている場合、引用符で囲んで使用することをお勧めします。そうしないと予期しない結果が生じることがあります。
以下の場合がその例です。a.txt
ファイルと My
ファイルを Home
ディレクトリにコピーするコマンドですが、My
という名前のファイルがないため、エラーメッセージが表示されます。

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

ファイルのパーミッション問題
時折、ファイルに対する権限がなくてもコピーしなければならない場合があります。そのような場合には、sudo
コマンドを使用してコピーしてください。
以下の図では、c.txt
ファイルは root
ユーザーのみに読み取り権限があります。そのため、ユーザー ito
はアクセス権限がなく、ファイルをコピーできません。このような場合には sudo
コマンドを使用してコピーできます。

複数のオプション
複数のオプションを同時に適用する必要がある場合、一緒に書くと便利です。例えば、-r
オプションと -L
オプションを一緒に使用する場合、先に述べた -L
オプションの内容のように -rL
と一緒に使用できます。もちろん、-r -L
と個別に書いても構いません。
まとめ
Linuxコマンド cp
はファイルとディレクトリをコピーするための必須ツールです。基本的な使い方からさまざまなオプションを活用して有効に利用することができ、他のツールと組み合わせて効率的な作業環境を構築できます。さらに疑問や詳細を知りたいことがあれば、いつでも質問してください!
このポスティングが皆さんのLinux活用に役立つことを願っています。