今回はLinuxコマンドであるcpコマンドについて解説します
cpコマンドはディレクトリやファイルをコピーするLinuxの基本コマンドです
ぜひ覚えて帰ってくださいね!
※注 本文の△は半角スペースに置き換えてください。わかりやすくするために△で記述してます
cpコマンドとは??
cpコマンドはディレクトリやファイルをコピーするコマンドです
ファイル、フォルダをコピーする際に使用します
「copy」を省略して「cp」になっています
指定の仕方としては、「cp△コピー元△コピー後ファイル名」と指定します(ディレクトリをコピーする場合は「-r」か「-R」オプションを使用します)
コピー元のファイルをコピー後ファイル名でコピーします
また、ファイルを複数指定してコピーすることも可能です
「*」はメタキャラクタと呼ばれる特殊文字で、直前の文字を0回以上繰り返します
「./」でカレントディレクトリを表すので、「./*」でカレントディレクトリ配下の全ファイルを指定してコピーしています
あるディレクトリ配下のファイルのバックアップをしたいときに使うと早くて便利です
cp△ファイル名
cp△ファイル1△ファイル2△ファイル3△コピー先ディレクトリ名
普通にファイルをコピーする場合

ファイルを複数指定している場合

./*で全ファイルを指定している場合

cpコマンドの主なオプション
オプション | 意味 |
---|---|
-i (--interactive) | コピー先に同じファイルがあった場合上書きしていいか確認する |
-f (--force) | ユーザへの確認を行わず強制的にコピーする |
-r,-R (--recursive) | サブディレクトリ含め、再帰的にディレクトリ全体をコピーする |
-b (--backup) | コピー先に同名のファイルがあればバックアップを取ってから上書きする |
-v (--verbose) | 削除処理を行う際の詳細情報を表示する |
-s (--symbolic-link) | シンボリックリンクを作成する |
-l (--link) | ハードリンクを作成する |
-n (--no-clobber) | コピー先に同名のファイルやディレクトリがあったら上書きしない |
-p (--preserve) | 元ファイルのオーナ、グループ、パーミッション、タイムスタンプごとコピーする |
-S△接尾語 (--suffix=接尾語) | バックアップファイルを作る際のファイル名末尾に着ける文字を指定する |
-d | シンボリックリンク自体をコピーする |
-a (--archive) | アーカイブコピーを行う |
-u (--update) | コピー元ファイルがコピー先ファイルより新しい場合、または同名ファイルがコピー先に存在しない場合のみコピーする |
-x (--one-file-system) | コピー元と異なるファイルシステムにまたがってコピーを行わない |
-t △ディレクトリ (--target-directory=ディレクトリ) | コピー先ディレクトリを明示的に指定する |
-T (--no-target-directory) | コピー先をディレクトリとして扱わない |
--preserve=ATTR | 保持する属性を選択的に指定する |
--no-preserve=ATTR | 特定の属性を保持しないよう指定する |
--reflink | COW(Copy-on-Write)ファイルシステムでリフリンクコピーを作成する |
--sparse | スパースファイルを効率的にコピーする |
-i (–interactive)
コピー先に同じファイルがあった場合上書きしていいか確認するオプション
「interactive」のiです
エイリアス機能というコマンドをひとまとめにできる機能があるのですが、「cp」だけで「cp△-i」を呼び出してくれる設定がしてある可能性があります
その場合「cp」コマンドのみでも「cp△-i」の働きをしてくれます
「alias」コマンドを引数なしで実行することで、現在設定されているエイリアス機能を確認することが出来ます
「alias△cp△=’cp△-i’」と記載があったらcpコマンドのみでも「cp△-i」の働きをしてくれますよ
cp△-i△コピー元△コピー後ファイル名

-f (–force)
ユーザへの確認を行わず強制的にコピーするオプション
よくオプションは頭文字がつけられることが多いのですが、
こちらは「force」の頭文字のfと覚えましょう
先ほど「-i」コマンドで説明しましたが、cpコマンドにエイリアス機能がついている可能性があります
その場合「-f」オプションを使用しても強制的にコピーせずに確認してくれます
エイリアス機能がいらない場合は「unalias△cp」でcpコマンドのエイリアス機能を削除してあげましょう
個人的にはエイリアス機能は入れてあるのがおすすめなので、削除しない方が良いと思います
下記実行コマンドでは、エイリアス機能を削除しています
cp△-f△コピー元△コピー後ファイル名

-r,-R (–recursive)
サブディレクトリ含め、再帰的にディレクトリ全体をコピーするオプション
ディレクトリをコピーする場合、「-r」「-R」オプションを使用しないとコピーできません
下記実行結果は「-r」オプションのみですが、「-R」オプションでも同じように使用することが出来ます
cp△-r△コピー元△ディレクトリ名
cp△-R△コピー元△コピー後ディレクトリ名

-b (–backup)
コピー先に同名のファイルがあればバックアップを取ってから上書きするオプション
コピー先の元のファイル名が「既存ファイル名~」に変わって、コピー元のファイル名が指定したファイル名に変わります
cp△-b△コピー元△コピー後ファイル名

-v (–verbose)
コピー処理を行う際の詳細情報を表示するオプション
「`コピー元’ -> `コピー後ファイル名’」 と表示されます
cp△-v△コピー元△コピー後ファイル名

-s (–symbolic-link)
シンボリックリンクを作成するオプション
「ln△-s△」でシンボリックリンクを作成するのですが、「cp△-s」コマンドでもシンボリックリンクを作成することが出来ます
シンボリックリンクはファイル名でもディレクトリ名でも可能です
cp△-s△シンボリックリンク元△シンボリックリンク名

-l (–link)
ハードリンクを作成するオプション
lnコマンドでハードリンクを作成するのですが、「cp△-l」コマンドでもハードリンクを作成することが出来ます
「ls△-△li」コマンドでiノード番号が同じことが確認できるので、ハードリンクが作成されていることがわかります
cp△-l△ハードリンク元△ハードリンク名

-n (–no-clobber)
コピー先に同名のファイルやディレクトリがあったら上書きしないオプション
コピー先のファイルをどうしても上書きしたくないときに使います
ファイルがある場合は上書きされず「cp」は実行されません
cp△-n△コピー元△コピー後ファイル名

-p (–preserve)
元ファイルのオーナ、グループ、パーミッション、タイムスタンプごとコピーするオプション
cp△-p△コピー元△コピー後ファイル名

-S△接尾辞 (–suffix=接尾辞)
バックアップファイルを作る際のファイル名末尾に着ける文字を指定するオプション
よく日付でバックアップファイルを作成することがあるのですが、そういう時に
「-S△_$(date△+%Y%m%d)」を指定してあげるとコピー元ファイルの名前がコピー先にあった場合に
コピー先ファイルの後にYYYYMMDD(年月日)が入るようになります
下の実行結果を見ていただければわかると思うのですが、元あったfileBBファイルが「fileBB_日付」としてバックアップファイルが作成され、fileAAをfileBBとしてコピーしています
cp△-S△接尾辞△コピー元△コピー後ファイル名

-d
シンボリックリンク自体をコピーするオプション
シンボリックリンクをコピーする際に「-d」オプションを入れてあげないとシンボリックリンクではなく、ただのファイルとしてコピーされてしまいます
下記実行結果では、DirB/DirD配下にシンボリックリンク元ファイルのfileAAがないため、シンボリックリンクfileAA_sym2がうまく機能しません
その場合はDirB/DirD配下にfileAAファイルを作成すればシンボリックリンクが機能するようになります
cp△-d△シンボリックリンク元△コピー後シンボリックリンク名

-a (–archive)
アーカイブコピーを行うオプション
「-dpR」オプションを組み合わせたのと同等の働きをします
ディレクトリ構造、シンボリックリンク、パーミッション、タイムスタンプなどすべての属性を保持してコピーします
バックアップを取る際によく使用されるオプションです
cp△-a△コピー元△コピー先
-u (–update)
コピー元ファイルがコピー先ファイルより新しい場合、または同名ファイルがコピー先に存在しない場合のみコピーするオプション
既存のファイルが最新の場合は無駄なコピー処理を省略できるため、効率的です
同期処理やバックアップ処理でよく使用されます
cp△-u△コピー元△コピー先
-x (–one-file-system)
コピー元と異なるファイルシステムにまたがってコピーを行わないオプション
マウントポイントを超えてコピーすることを防ぎます
システムディレクトリのバックアップ時に他のファイルシステムを誤ってコピーしないよう制限したい場合に有効です
cp△-rx△コピー元ディレクトリ△コピー先ディレクトリ
-t △ディレクトリ (–target-directory=ディレクトリ)
コピー先ディレクトリを明示的に指定するオプション
複数のファイルを一つのディレクトリにコピーする際に便利です
通常の構文とは逆で、最後にコピー先を指定する必要がありません
cp△-t△コピー先ディレクトリ△ファイル1△ファイル2△ファイル3
-T (–no-target-directory)
コピー先をディレクトリとして扱わないオプション
コピー先がディレクトリであっても、そのディレクトリ内ではなく、ディレクトリ自体を上書きしたい場合に使用します
cp△-T△コピー元△コピー先
–preserve=ATTR
保持する属性を選択的に指定するオプション
mode(パーミッション)、ownership(所有者情報)、timestamps(タイムスタンプ)、links(リンク)、context(SELinuxコンテキスト)、xattr(拡張属性)、all(すべて)から選択できます
cp△–preserve=mode,ownership△コピー元△コピー先
cp△–preserve=timestamps△コピー元△コピー先
–no-preserve=ATTR
特定の属性を保持しないよう指定するオプション
–preserveオプションの逆で、指定した属性のみを保持しません
cp△–no-preserve=mode△コピー元△コピー先
–reflink
COW(Copy-on-Write)ファイルシステムでリフリンクコピーを作成するオプション
BtrfsやZFSなどのファイルシステムで、実際のデータをコピーせずに参照のみをコピーします
ディスク容量を節約しながら高速にコピーできます
cp△–reflink△コピー元△コピー先
cp△–reflink=always△コピー元△コピー先 # 必ずリフリンクコピー
cp△–reflink=auto△コピー元△コピー先 # 可能ならリフリンクコピー
–sparse
スパースファイルを効率的にコピーするオプション
ファイル内の空きブロック(0で埋められた部分)を実際にディスクに書き込まず、論理的な空きとして扱います
大きなファイルでもディスク容量を節約できます
cp△–sparse=always△コピー元△コピー先 # 常にスパースファイルとして作成
cp△–sparse=auto△コピー元△コピー先 # 元ファイルがスパースの場合のみ
cp△–sparse=never△コピー元△コピー先 # スパースファイルにしない
オプションの組み合わせ例
実際の運用では複数のオプションを組み合わせて使用することが多いです
cp△-av△/home/user/documents△/backup/documents
# -a: アーカイブコピー、-v: 詳細表示
cp△-ibv△*.txt△/target/directory
# -i: 確認、-b: バックアップ、-v: 詳細表示
cp△-ruv△source/△target/
# -r: 再帰的、-u: 更新のみ、-v: 詳細表示
まとめ
いかがでしたでしょうか
今回はcpコマンドについてまとめてみました
cpコマンドはディレクトリやファイルのコピーができるコマンドでLinuxの基本コマンドです
豊富なオプションを組み合わせることで、様々な場面に対応できる汎用性の高いコマンドです
mvコマンドやrmコマンドとオプションが似ているのでmv、rmコマンドも一緒に覚えてしまいましょう!