cpでファイルをコピーする

cpでファイルをコピーする とは

ファイルコピーの基本コマンド「cp」を、オプション指定を含めてターミナルで使いこなしましょう。本レッスンでは、cpでファイルをコピーする の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

設定ファイルの編集前バックアップ、テストデータの複製、デプロイ前の成果物コピーなど、ファイルをコピーする場面は無数にあります。cp は最も基本的なコピーコマンドで、一文字違いの操作ミスが大きな事故を引き起こすことがあるため、安全に使うコツとセットで覚えましょう。

業務サーバーでは「/etc/nginx/nginx.conf を編集する前にバックアップを取る」「リリース時に新バージョンの成果物を一時ディレクトリへコピーしてから検証する」などの操作が日常です。cp の使い方が雑だと、本番設定ファイルを上書きしてサービス停止、といった事故にも直結します。

基本構文

ターミナル

cp [オプション] コピー元 コピー先 cp [オプション] コピー元1 コピー元2 ... コピー先ディレクトリ

主要オプションは下記のとおりです。

オプション役割
-rディレクトリごと再帰コピー
-i上書き前に確認
-p権限・タイムスタンプを保持
-a-r と -p を含む「アーカイブ」モード
-vコピーの様子を表示
-n上書きしない(既存があれば何もしない)
-u新しいものだけコピー
--backup上書き前に自動でバックアップを作る

動作の図解

diagram (will load when visible)

代表例

ターミナル

# ファイルを別名でコピー $ 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 dstdst がすでに存在するときは 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

本番の重要ファイルでは、cmpsha256sum でハッシュ一致を確認すると確実です。

やってみよう

演習エディタで簡単なファイルを作って cp で複製したり、ディレクトリを cp -r で丸ごとコピーしてみましょう。コピー後に ls -la でタイムスタンプの違いを観察するのもおすすめです。diff でコピー元とコピー先の内容が一致することも確認してみましょう。

まとめ

  • ファイルは cp 元 先、ディレクトリは cp -r 元 先
  • 上書き事故を防ぐなら -i、属性保持なら -p、両方なら -a
  • 編集前バックアップは cp file file.bak が定番
  • 大量コピーや差分転送には rsync も視野に入れる

次のレッスン

次は mvでファイルを移動する で、ファイルの移動・リネームを cp との違いとあわせて学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. cp コマンド の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. cp コマンド とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

課題

  1. cp を使う
  2. コピー後の中身が apple

ヒント

script.sh
script.sh
学習モード
script.sh
ターミナル出力