cpでファイルをコピーする
cpでファイルをコピーする とは
ファイルコピーの基本コマンド「cp」を、オプション指定を含めてターミナルで使いこなしましょう。本レッスンでは、cpでファイルをコピーする の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ重要か
設定ファイルの編集前バックアップ、テストデータの複製、デプロイ前の成果物コピーなど、ファイルをコピーする場面は無数にあります。cp は最も基本的なコピーコマンドで、一文字違いの操作ミスが大きな事故を引き起こすことがあるため、安全に使うコツとセットで覚えましょう。
業務サーバーでは「/etc/nginx/nginx.conf を編集する前にバックアップを取る」「リリース時に新バージョンの成果物を一時ディレクトリへコピーしてから検証する」などの操作が日常です。cp の使い方が雑だと、本番設定ファイルを上書きしてサービス停止、といった事故にも直結します。
基本構文
ターミナル
cp [オプション] コピー元 コピー先
cp [オプション] コピー元1 コピー元2 ... コピー先ディレクトリ主要オプションは下記のとおりです。
| オプション | 役割 |
|---|---|
| -r | ディレクトリごと再帰コピー |
| -i | 上書き前に確認 |
| -p | 権限・タイムスタンプを保持 |
| -a | -r と -p を含む「アーカイブ」モード |
| -v | コピーの様子を表示 |
| -n | 上書きしない(既存があれば何もしない) |
| -u | 新しいものだけコピー |
| --backup | 上書き前に自動でバックアップを作る |
動作の図解
代表例
ターミナル
# ファイルを別名でコピー
$ cd /tmp && echo hello > a.txt
$ cp a.txt b.txt
$ cat b.txt
helloターミナル
# ディレクトリごとコピー(-r 必須)
$ cd /tmp && mkdir -p src && echo data > src/info.txt
$ cp -r src dst
$ cat dst/info.txt
dataターミナル
# 同じディレクトリに複数ファイルを集約
$ cd /tmp && mkdir -p inbox
$ touch f1.txt f2.txt
$ cp f1.txt f2.txt inbox/
$ ls inbox
f1.txt
f2.txtターミナル
# アーカイブモードで権限ごと丸ごと
cp -a /etc/skel /tmp/skel_backup 2>/dev/null || trueバックアップに便利なテンプレ
ターミナル
# 編集前に .bak を作る
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bakタイムスタンプ付きでバックアップしたい場合は次の通りです。
ターミナル
cp app.yml app.yml.$(date +%Y%m%d_%H%M%S)--backup オプションを使うと、上書きが起きるたびに自動で .~1~ のようなナンバリング付きバックアップが残ります。
ターミナル
cp --backup=numbered new.conf /etc/app.conf
cpはコピー先が既存ファイルの場合、警告なく上書きします。本番のファイルを扱うときはcp -iか、別名で先にバックアップを取る運用が安全です。
「変更する前にコピーを取る」は運用の鉄則です。
cpは変更の取り消し線でもあります。
ディレクトリコピーの注意
cp dir1 dir2だけだと 失敗 します(ディレクトリには-rが必要)cp -r src dstでdstがすでに存在するときはdst/srcという形でネストする点に注意- 大量コピーは
rsync -aの方が安全で速いこともあります(差分転送・進捗表示・再開可) - シンボリックリンクを保ったままコピーしたいときは
cp -dまたはcp -a
rsync が向く場面
何百GBもあるディレクトリを途中再開できるようコピーしたい、ネットワーク越しにコピーしたい、変更分だけ反映したい、というケースでは rsync を選びます。
ターミナル
rsync -avh --progress /tmp/src/ /tmp/dst/末尾の / の有無で「中身だけコピー」と「ディレクトリごとコピー」が変わる、という独特の仕様には注意が必要です。
コピーの確認方法
コピーが正しく行えたかは、サイズや内容を突き合わせて確認します。
ターミナル
# サイズを比較
wc -c a.txt b.txt
# 内容が完全一致か(差分なしなら何も出ない)
diff a.txt b.txt && echo same本番の重要ファイルでは、cmp や sha256sum でハッシュ一致を確認すると確実です。
やってみよう
演習エディタで簡単なファイルを作って cp で複製したり、ディレクトリを cp -r で丸ごとコピーしてみましょう。コピー後に ls -la でタイムスタンプの違いを観察するのもおすすめです。diff でコピー元とコピー先の内容が一致することも確認してみましょう。
まとめ
- ファイルは
cp 元 先、ディレクトリはcp -r 元 先 - 上書き事故を防ぐなら
-i、属性保持なら-p、両方なら-a - 編集前バックアップは
cp file file.bakが定番 - 大量コピーや差分転送には
rsyncも視野に入れる
次のレッスン
次は mvでファイルを移動する で、ファイルの移動・リネームを cp との違いとあわせて学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- cp コマンド の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. cp コマンド とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
課題
- cp を使う
- コピー後の中身が apple