Ubuntu cpコマンド完全攻略:属性保持バックアップから効率的なコピー術まで

はじめに

Linux環境でのシステム管理や開発業務において、ファイルやディレクトリの複製操作は日常的に発生する基本中の基本です。本稿では、標準的な cp コマンドを用いたシンプルな複製から、ディレクトリ全体の再帰的コピー、パーミッションやタイムスタンプを維持するアーカイブ処理(-a)、変更差分に応じた更新コピー(-u)、さらには上書き事故を防ぐ自動ナンバリングバックアップまで、現場で必須となる実践テクニックを詳しく解説します。

基本的な単一ファイル複製と進行状況の可視化 (-v, -i)

検証用の作業領域を確保するため、ソースおよびターゲットディレクトリを作成し、作業ルートへカレントディレクトリを移動します。

mkdir -p ~/cp_practice/src ~/cp_practice/dest && cd ~/cp_practice を実行します。

作業用ディレクトリの作成と移動

コピー実験に使用するサンプルのテキストファイルを準備するため、echo "Ubuntu cp command tutorial" > src/sample.txt を実行します。

サンプルファイルの生成

cp は、ソースとなるファイルやディレクトリを任意の保存先へコピーするための基本ユーティリティです。
-v(verbose)オプションを付与すると、どのファイルがどのターゲットパスへ配置されたのか、端末上にリアルタイムで進捗メッセージが出力されます。

⚙️ [主要オプション一覧]

-v : コピー処理の進行状況を標準出力へ詳細に出力します。
-i : コピー先に同名ファイルが既に存在する場合、上書きの可否を対話形式で確認します。
-r : ディレクトリ内部を再帰的に走査し、全サブフォルダおよびファイルを一括複製します。
-p : 所有者、所属グループ、パーミッション、更新日時などのメタデータを保持したまま複製します。
-a : シンボリックリンクや各種属性情報を完全に保ったまま転送するアーカイブモードです。
-u : コピー先が存在しない場合、あるいはソースファイルの方が新しい場合のみ書き込みを行います。
-b : 上書きを行う直前に、既存ファイルのバックアップを自動生成します。

cpコマンドによる詳細出力付きファイルコピー

指定したターゲットパスに複製ファイルが正常に生成されたかを確かめるため、ls -l dest/sample_copy.txt を実行します。

コピー結果のファイル情報確認

ファイル更新時の条件付きコピー動作をテストするため、ソースファイルの内容を書き換える echo "Updated content" > src/sample.txt を実行します。

ソースファイルの内容更新

-u オプションを付加して実行すると、ソース側のタイムスタンプがターゲット側よりも進んでいる場合に限って上書き処理が実行されます。
修正を加えたソースファイルのほうが最新状態であるため、正常に上書きコピーが実施されたことがコンソール出力から確認できます。

更新フラグを付与した条件付きコピーの実行

階層構造の再帰コピーと属性・パーミッションの完全保持 (-r, -a)

ディレクトリツリーの構造変化を視覚的に把握できるようにするため、apt-get update -qq && apt-get install -y tree で tree コマンドを導入します。

treeパッケージのインストール

ネストされたディレクトリ複製のテスト環境として、設定用およびログ用の階層を含んだ project ディレクトリを作成します。

テスト用ディレクトリ階層の作成

配置対象となる設定ファイル app.env を用意し、設定値を書き込みます。

環境設定ファイルの生成

続いて、稼働状況を模したログファイル app.log を作成します。

サンプルログファイルの生成

-r オプションを指定し、project ディレクトリとその内部に含まれる全ファイルを project_backup へ再帰的に複製します。

再帰オプションによるディレクトリ複製

権限設定や所有者、タイムスタンプなどの各種属性を損なわずにバックアップを退避させたい場合は、-a(archive)オプションを指定して project_archive ディレクトリへコピーします。

アーカイブモードによる属性維持コピー

複製されたディレクトリ構造を階層的に確認するため、tree -L 3 ~/cp_practice を実行して深さ3階層までのツリーを展開します。

ディレクトリ構成のツリー表示確認

差分更新(-u)と安全な世代管理バックアップの実践

タイムスタンプの比較による更新処理と自動退避バックアップを検証するため、出力先となる mkdir -p ~/cp_practice/backup_demo/dest を実行します。

バックアップ検証用ディレクトリの作成

検証対象となる元ファイル config.json を作成し、初期状態を書き込むため echo "Version 1.0" > ~/cp_practice/backup_demo/config.json を実行します。

初期設定ファイルの作成

生成した config.json を出力先ディレクトリへ初期配置します。
標準の cp コマンドで同名ファイルとしてターゲットパスへ書き出します。

初期ファイルのコピー配置

タイムスタンプの前後関係を明確にするため、1秒の待機時間を挟んだ後にファイル内容を更新します。

1秒待機後のファイル更新処理

-u と -v を組み合わせ、ソースファイルが新しく更新された場合のみターゲットを上書きします。
ソース側の最終更新日時が新しいため、ターゲットファイルに対して正しく上書きが実行された旨が端末に表示されます。

更新判定オプションを用いた上書き処理

誤ったデータ破棄を防ぐため、--backup=numbered を指定して既存ターゲットをナンバリング形式で退避させながらコピーを実行します。
処理の結果、上書き前の旧ファイルが config.json.~1~ として自動保存され、その上で新しい内容が配置されたことが確認できます。

ナンバリングバックアップ付きコピー

退避バックアップと新規ファイルの状態を確認するため、ls -la ~/cp_practice/backup_demo/dest を実行します。
最新の config.json と並んで、旧世代の config.json.~1~ が正しく共存していることが確認できます。

バックアップ世代ファイルの確認

複数ファイルの一括転送とターゲットディレクトリ事前指定 (-t)

複数ファイルの一括コピーを検証するための配置先ディレクトリとして、mkdir -p ~/cp_practice/bulk_demo/target を実行します。

一括配置先ディレクトリの作成

一括複製の対象となるログファイルを複数まとめて生成するため、touch ~/cp_practice/bulk_demo/report1.log ~/cp_practice/bulk_demo/report2.log ~/cp_practice/bulk_demo/report3.log を実行します。

複数ログファイルの一括生成

-t オプションを利用すると、配置先ディレクトリを先頭に明示し、末尾に任意のワイルドカード(*)パターンを展開して複数の入力ファイルをまとめて複製できます。
-v オプションの併用により、各ログファイルが順次ターゲットへ送られる様子がコンソールに逐次出力されます。

ターゲット指定オプションによる一括コピー

転送先に全ファイルが抜け漏れなくコピーされたかを検証するため、ls -l ~/cp_practice/bulk_demo/target を実行します。
対象だった3つのログファイルがすべてターゲット配下に存在していることが分かります。

コピー先ファイルの配置確認

演習が完了したため、今回作成した検証用の練習ディレクトリおよび一時ファイルを rm -rf ~/cp_practice でまとめてクリーンアップします。

検証用ディレクトリの削除

まとめ

本稿では、Ubuntuにおけるファイル複製の基本構文から、属性やパーミッションを厳密に保つアーカイブモード(-a)、更新差分のみを反映する -u、誤操作からデータを守る世代別バックアップオプション、そして -t を用いた効率的な複数ファイルの一括配置まで、実務で役立つ cp コマンドの実践的な活用方法を紹介しました。

用途や運用の要件に応じてこれらのフラグを適切に使い分け、安全かつ効率的なファイル管理業務に役立ててください。