cpコマンドでファイルをコピーする方法|-rや-aの違いと実務での使い分けコマンド


この記事の監修:宮崎智広(Linux教育歴15年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxコマンド, LinuxコマンドA-E, ファイル・ディレクトリ管理コマンド > cpコマンドでファイルをコピーする方法|-rや-aの違いと実務での使い分けコマンド
「ファイルをコピーしたはずなのに、パーミッションやタイムスタンプが変わってしまった」
「ディレクトリごとコピーしようとしたら、中身が空だった」
Linuxサーバーの運用では、設定ファイルのバックアップや環境の複製など、ファイルコピーの作業が頻繁に発生します。

この記事では、Linuxのファイルコピーに使う cp コマンドの基本から実務で役立つオプションまで解説します。
単純なコピーだけでなく、-r(ディレクトリごとコピー)と -a(属性を完全保持したコピー)の違い、設定ファイルのバックアップ手順、rsync との使い分けまで網羅しました。

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を無料で手に入れる 図解60P/登録10秒/解除も3秒

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/

サーバーの設定ディレクトリやWebコンテンツのバックアップには、-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

※RHEL系のデフォルト設定では、rootユーザーの場合 cpalias 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

SELinuxが原因の場合は、restorecon でコピー先のセキュリティコンテキストを修正するか、適切なポリシーを設定してください。安易に setenforce 0 で無効化するのはセキュリティ上やめましょう。

本記事のまとめ

やりたいこと コマンド
ファイルを別名でコピーする cp コピー元 コピー先
ディレクトリごとコピーする cp -r ディレクトリ名 コピー先
属性を完全保持してコピーする cp -a コピー元 コピー先
上書き前に確認する cp -i コピー元 コピー先
コピー状況を表示する cp -av コピー元 コピー先
バックアップ付きでコピーする cp --backup=numbered コピー元 コピー先
ワイルドカードで一括コピーする cp *.conf コピー先ディレクトリ/
カレントディレクトリにコピーする cp コピー元 .
aliasを無視して強制上書きする \cp コピー元 コピー先


暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

※登録30秒/合わなければ解除3秒


宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。

図解60pのLinux無料マニュアル
登録10秒/自動返信でDL
無料で受け取る