「ディレクトリごとコピーしようとしたら、中身が空だった」
Linuxサーバーの運用では、設定ファイルのバックアップや環境の複製など、ファイルコピーの作業が頻繁に発生します。
この記事では、Linuxのファイルコピーに使う
cp コマンドの基本から実務で役立つオプションまで解説します。単純なコピーだけでなく、
-r(ディレクトリごとコピー)と -a(属性を完全保持したコピー)の違い、設定ファイルのバックアップ手順、rsync との使い分けまで網羅しました。でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
cpコマンドとは?基本構文と動作
cp(copy)は、ファイルやディレクトリをコピーするコマンドです。基本構文は以下の通りです。
# ファイルをコピーする # cp コピー元 コピー先 # ディレクトリにコピーする # cp コピー元 コピー先ディレクトリ/
# index.html を index_backup.html という名前でコピーする # cp index.html index_backup.html # index.html を /tmp/ ディレクトリにコピーする # cp index.html /tmp/
基本オプション一覧
cp コマンドでよく使うオプションを押さえておきましょう。・-r(--recursive):ディレクトリを中身ごと再帰的にコピーする。ディレクトリをコピーする場合は必須
・-a(--archive):アーカイブモード。
-r に加え、パーミッション・所有者・タイムスタンプ・シンボリックリンクなど全ての属性を保持してコピーする・-i(--interactive):コピー先に同名ファイルが存在する場合、上書きしてよいか確認する
・-f(--force):コピー先に同名ファイルがあっても確認なしで強制上書きする
・-p(--preserve):パーミッション・所有者・タイムスタンプを保持してコピーする
・-v(--verbose):コピーの経過を表示する。大量ファイルのコピー時に進捗を把握できる
ファイルのコピー(基本操作)
1. ファイルを別名でコピーする
最もシンプルな使い方です。設定ファイルのバックアップを取る場面で頻繁に使います。# httpd.conf のバックアップを作成する # cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak
2. 複数ファイルをまとめてコピーする
コピー元を複数指定して、最後にコピー先ディレクトリを指定します。# 3つのファイルを /tmp/backup/ にまとめてコピーする # cp file1.txt file2.txt file3.txt /tmp/backup/
3. ワイルドカードで一括コピーする
特定の拡張子のファイルをまとめてコピーしたい場合は、ワイルドカード(*)を使います。# カレントディレクトリの .conf ファイルを全て /tmp/backup/ にコピーする # cp *.conf /tmp/backup/ # /etc/httpd/conf.d/ 配下の .conf ファイルをまとめてコピーする # cp /etc/httpd/conf.d/*.conf /tmp/backup/
4. カレントディレクトリにコピーする
他のディレクトリにあるファイルを、今いるディレクトリにコピーしたい場合は、コピー先に.(ドット=カレントディレクトリ)を指定します。# /etc/hosts をカレントディレクトリにコピーする # cp /etc/hosts .
ディレクトリのコピー(-r と -a の違い)
ディレクトリをコピーする場合、-r か -a オプションが必要です。オプションなしでディレクトリを指定すると、以下のエラーになります。# cp: -r not specified; omitting directory 'mydir'
1. -r でディレクトリごとコピーする
-r(recursive)は、ディレクトリの中身を再帰的にコピーします。# mydir ディレクトリを mydir_backup としてコピーする # cp -r mydir mydir_backup
-r だけでは、コピー先のタイムスタンプがコピー実行時の日時に変わり、シンボリックリンクは実体ファイルとしてコピーされます。2. -a でディレクトリを完全にコピーする(推奨)
-a(archive)は -r の上位互換です。以下の属性を全て保持したままコピーします。・パーミッション:元のファイルと同じ権限を維持する
・所有者・グループ:元のファイルと同じ所有者情報を維持する
・タイムスタンプ:更新日時が変わらない
・シンボリックリンク:リンクのまま保持する(実体ファイルに変換しない)
# 属性を完全に保持してディレクトリをコピーする # cp -a /var/www/html/ /var/www/html_backup/
-r ではなく -a を使うのが現場の鉄則です。-r だとパーミッションやタイムスタンプが変わり、復元時にトラブルの原因になります。実務で使えるcpの応用テクニック
1. 上書き前に確認する(-i)
大事なファイルを誤って上書きしないために、-i(interactive)を付けて確認プロンプトを出す習慣をつけましょう。# 上書き確認付きでコピーする # cp -i original.conf /etc/httpd/conf/httpd.conf cp: overwrite '/etc/httpd/conf/httpd.conf'? y
cp に alias cp='cp -i' が設定されていることが多く、自動的に上書き確認が入ります。aliasを無効にして強制上書きしたい場合は \cp(バックスラッシュ付き)を使います。2. バックアップ付きでコピーする(--backup)
コピー先に同名ファイルがある場合、上書きの前に自動でバックアップを残す方法です。# 同名ファイルがあれば .~1~ のようなバックアップを作ってからコピーする # cp --backup=numbered httpd.conf /etc/httpd/conf/httpd.conf # 結果: 元のファイルが httpd.conf.~1~ としてバックアップされる
--backup=numbered を指定すると、.~1~、.~2~ と番号付きでバックアップが残るため、履歴管理にも使えます。3. コピー状況を表示する(-v)
大量のファイルをコピーする際、-v(verbose)を付けると何がコピーされているか確認できます。# コピー状況を表示しながらディレクトリをコピーする # cp -av /var/www/html/ /backup/html_20240301/ '/var/www/html/index.html' -> '/backup/html_20240301/index.html' '/var/www/html/style.css' -> '/backup/html_20240301/style.css'
4. /etc 配下の設定ファイルをバックアップする(実務例)
サーバーの設定変更前に、関連する設定ファイルをまとめてバックアップしておくのは運用の基本です。# バックアップ先ディレクトリを日付付きで作成する # mkdir -p /root/backup/etc_$(date +%Y%m%d) # /etc/httpd/ 配下を属性保持でバックアップする # cp -a /etc/httpd/ /root/backup/etc_$(date +%Y%m%d)/httpd/ # /etc/sysconfig/ 配下もバックアップする # cp -a /etc/sysconfig/ /root/backup/etc_$(date +%Y%m%d)/sysconfig/
-a を使って属性を保持することと、日付付きのディレクトリに保存して「いつの時点のバックアップか」を明確にすることです。cpとrsyncの使い分け
ファイルのコピーやバックアップにはrsync というコマンドもあります。どちらを使うべきか迷う場面があるので、使い分けの基準を整理しておきましょう。| 比較項目 | cp -a | rsync -a |
|---|---|---|
| 用途 | 単発のコピー・バックアップ | 定期バックアップ・差分同期 |
| 差分コピー | できない(毎回全てコピー) | 変更されたファイルだけコピー |
| リモートコピー | できない | SSH経由でリモートサーバーへコピー可能 |
| 速度(大量ファイル) | 毎回全コピーのため遅い | 差分だけなので2回目以降は高速 |
結論として、「1回限りのコピーやバックアップ」なら
cp -a で十分です。「毎日のバックアップ」や「リモートサーバーへの同期」が必要な場合は rsync を使いましょう。「Permission denied」が出た時の対処法
cp コマンドで最も多いエラーが「Permission denied」です。原因と対処法を押さえておきましょう。1. コピー先ディレクトリへの書き込み権限がない場合
一般ユーザーで/etc や /var など、root権限が必要なディレクトリにコピーしようとすると発生します。# 一般ユーザーで実行するとエラーになる $ cp myfile.txt /etc/ cp: cannot create regular file '/etc/myfile.txt': Permission denied # sudo を付けて実行する $ sudo cp myfile.txt /etc/
2. コピー元ファイルの読み取り権限がない場合
他のユーザーが所有するファイルで、読み取り権限が付与されていない場合に発生します。# 権限を確認する $ ls -l /root/secret.conf -rw------- 1 root root 1024 Mar 01 10:00 /root/secret.conf # 一般ユーザーでは読めないため、sudo を使う $ sudo cp /root/secret.conf /tmp/
3. SELinuxによるアクセス拒否の場合
RHEL系ではSELinux(Security-Enhanced Linux)が有効になっていることが多く、通常の権限では問題ないのにコピーが拒否されるケースがあります。# SELinuxの状態を確認する # getenforce Enforcing # 監査ログでSELinuxの拒否を確認する # ausearch -m AVC -ts recent
restorecon でコピー先のセキュリティコンテキストを修正するか、適切なポリシーを設定してください。安易に setenforce 0 で無効化するのはセキュリティ上やめましょう。本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| ファイルを別名でコピーする | cp コピー元 コピー先 |
| ディレクトリごとコピーする | cp -r ディレクトリ名 コピー先 |
| 属性を完全保持してコピーする | cp -a コピー元 コピー先 |
| 上書き前に確認する | cp -i コピー元 コピー先 |
| コピー状況を表示する | cp -av コピー元 コピー先 |
| バックアップ付きでコピーする | cp --backup=numbered コピー元 コピー先 |
| ワイルドカードで一括コピーする | cp *.conf コピー先ディレクトリ/ |
| カレントディレクトリにコピーする | cp コピー元 . |
| aliasを無視して強制上書きする | \cp コピー元 コピー先 |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
※登録30秒/合わなければ解除3秒
