Linuxでファイルをコピーする方法は多数存在しますが、それぞれ異なる特性と用途を持っています。この記事では、主要なコピーコマンドを徹底比較し、各コマンドの特徴、パフォーマンス、最適な使用場面を詳しく解説します。
目次
- Linuxコピーコマンドの基礎知識
- 各コマンドの詳細解説と比較
- パフォーマンス特性と選択基準
- 実用的な使用例
- 最適なコマンドの選び方
Linuxコピーコマンドの基礎知識
Linuxには用途に応じた多様なコピーコマンドが用意されています。コマンドの選択は、コピー先の場所、データの種類、速度要件、同期の必要性などの要因によって決まります。
コマンド選択の主要な評価軸
- 転送速度:データのコピーにかかる時間
- 機能性:差分同期、圧縮、暗号化などの機能
- 対象範囲:ローカル/リモート、ファイル/ディスク単位
- 進捗表示:転送状況の可視化
- 再開機能:中断からの復帰能力
- リソース使用量:CPU、メモリの消費量
主要コピーコマンド詳細解説
1. cp:標準的なファイルコピー
cpは、Linuxで最も基本的なファイルコピーコマンドです。シンプルで高速ですが、進捗表示や差分コピーなどの高度な機能はありません。
特徴
- 対象:ローカルファイル・ディレクトリ
- 速度:高速(特にローカルコピー)
- 機能:基本的なコピー操作のみ
- 進捗表示:なし(標準では)
- 差分コピー:なし
- リソース使用:少ない
基本的な使用例
# ファイルのコピー
cp file1.txt file2.txt
# ディレクトリのコピー(再帰的)
cp -r /source/dir /destination/dir
# 属性を保持してコピー
cp -p file1.txt file2.txt
# 対話モードで上書き確認
cp -i file1.txt file2.txt
# 詳細情報を表示
cp -v file1.txt file2.txt
# 強制的に上書き
cp -f file1.txt file2.txt
# シンボリックリンクをそのままコピー
cp -d link1 link2
# アーカイブモード(-a = -dpR)
cp -a /source/dir /destination/dir
主要オプション
-r, -R:ディレクトリを再帰的にコピー-p:パーミッション、タイムスタンプを保持-a:アーカイブモード(-dpR相当)-i:上書き前に確認-v:詳細表示-f:強制的に上書き-u:新しいファイルのみコピー-n:既存ファイルを上書きしない
推奨使用場面
- ローカルでの単純なファイルコピー
- 小規模なディレクトリのコピー
- スクリプト内での高速コピー
- 初回の全体コピー
2. rsync:高機能な同期ツール
rsyncは、ローカル・リモート間でファイルを効率的に同期するコマンドです。差分転送により、変更されたファイルのみを転送するため、大規模なデータセットの同期に最適です。
特徴
- 対象:ローカル・リモート両対応
- 速度:初回は遅いが、2回目以降は高速
- 機能:差分転送、圧縮、進捗表示、除外設定
- 進捗表示:あり
- 差分コピー:あり(最大の特徴)
- リソース使用:中程度
基本的な使用例
# 基本的な同期(ローカル)
rsync -av /source/ /destination/
# リモートサーバーへ同期
rsync -avz /local/dir/ user@remote:/remote/dir/
# リモートサーバーから同期
rsync -avz user@remote:/remote/dir/ /local/dir/
# 削除されたファイルも同期
rsync -av --delete /source/ /destination/
# 進捗表示付き
rsync -av --progress /source/ /destination/
# 帯域制限(KB/s)
rsync -av --bwlimit=1000 /source/ /destination/
# 特定ファイルを除外
rsync -av --exclude='*.log' /source/ /destination/
# Dry-run(実際には実行しない)
rsync -avn /source/ /destination/
# SSHポート指定
rsync -av -e "ssh -p 2222" /local/ user@remote:/remote/
主要オプション
-a:アーカイブモード(パーミッション、タイムスタンプ保持)-v:詳細表示-z:転送時に圧縮-P:進捗表示 + 部分転送の保持(–progress –partial)--delete:転送元にないファイルを削除--exclude:特定のファイル/ディレクトリを除外--bwlimit:帯域制限-n, --dry-run:実際には実行せずシミュレーション-u:新しいファイルのみ転送
cpとの比較
| 項目 | cp | rsync |
|---|---|---|
| 初回コピー速度 | 高速 | やや遅い(チェックサム計算のため) |
| 2回目以降 | 同じ速度 | 高速(差分のみ転送) |
| リモート対応 | なし | あり |
| 差分転送 | なし | あり |
| 進捗表示 | なし | あり |
| ネットワーク圧縮 | なし | あり |
| 中断からの再開 | 不可 | 可能 |
推奨使用場面
- 定期的なバックアップ
- 大規模ディレクトリの同期
- リモートサーバーとの同期
- 増分バックアップ
- ミラーリング
3. scp:セキュアなリモートコピー
scpは、SSHプロトコルを使用してリモートサーバー間でファイルを安全にコピーするコマンドです。シンプルですが、RHEL 9以降では非推奨とされています(セキュリティ脆弱性のため)。
特徴
- 対象:リモートホスト間
- 速度:中速
- 機能:暗号化転送、基本的なコピーのみ
- 進捗表示:簡易的(ファイル名と進捗率)
- 差分コピー:なし
- セキュリティ:SSH暗号化
基本的な使用例
# ローカルからリモートへファイルコピー
scp file.txt user@remote:/path/to/destination/
# リモートからローカルへコピー
scp user@remote:/path/to/file.txt /local/path/
# ディレクトリを再帰的にコピー
scp -r /local/dir user@remote:/remote/path/
# 複数ファイルをコピー
scp file1.txt file2.txt user@remote:/path/
# ポート指定
scp -P 2222 file.txt user@remote:/path/
# 帯域制限(Kbit/s)
scp -l 8000 file.txt user@remote:/path/
# 圧縮転送
scp -C file.txt user@remote:/path/
# 詳細モード
scp -v file.txt user@remote:/path/
主要オプション
-r:再帰的にディレクトリをコピー-P:ポート番号指定-p:パーミッション、タイムスタンプ保持-C:圧縮転送-l:帯域制限(Kbit/s)-v:詳細表示-q:静穏モード
重要な注意点
scpは非推奨:RHEL 9以降では既知のセキュリティ脆弱性があるため非推奨とされています。代わりにrsyncやsftpの使用が推奨されます。
推奨使用場面
- 単発のリモートファイル転送(レガシーシステム)
- 小規模なファイル転送
- 新規システムではrsyncの使用を推奨
4. dd:低レベルディスクコピー
ddは、ブロック単位でデータをコピーする低レベルツールです。ディスク全体のイメージ作成やパーティションのクローン作成に使用されます。
特徴
- 対象:ブロックデバイス、ファイル、パーティション
- 速度:ブロックサイズに依存
- 機能:ビットレベルのコピー
- 進捗表示:なし(標準では)
- 用途:ディスクイメージ、パーティションクローン
基本的な使用例
# ディスク全体のバックアップ
dd if=/dev/sda of=/path/to/backup.img bs=4M status=progress
# ディスクからディスクへクローン
dd if=/dev/sda of=/dev/sdb bs=4M status=progress
# ISOイメージをUSBに書き込み
dd if=/path/to/image.iso of=/dev/sdb bs=4M status=progress
# パーティションのバックアップ
dd if=/dev/sda1 of=/path/to/partition.img bs=4M
# 特定サイズをコピー(1GB)
dd if=/dev/sda of=output.img bs=1M count=1000
# MBRのバックアップ(最初の512バイト)
dd if=/dev/sda of=mbr_backup.img bs=512 count=1
# ゼロで埋める(ディスク消去)
dd if=/dev/zero of=/dev/sdb bs=4M status=progress
# ランダムデータで埋める
dd if=/dev/urandom of=/dev/sdb bs=4M status=progress
主要オプション
if=:入力ファイル(input file)of=:出力ファイル(output file)bs=:ブロックサイズ(推奨:4M~64M)count=:コピーするブロック数status=progress:進捗表示(新しいバージョン)conv=sync:入力ブロックをゼロでパディングconv=noerror:エラー時も継続
ブロックサイズの最適化
ddのパフォーマンスはbs(ブロックサイズ)の設定に大きく依存します。
- デフォルト(512バイト):非常に遅い
- 4M~64M:一般的に最適
- HDD:4M~8Mが推奨
- SSD:32M~64Mが推奨
- ネットワーク経由:1M~4Mが推奨
cpとの比較
| 項目 | cp | dd |
|---|---|---|
| 操作単位 | ファイル・ディレクトリ | ブロック(バイト) |
| 対象 | ファイルシステム上 | デバイス、パーティション全体 |
| ファイルシステム認識 | 必要 | 不要 |
| 部分コピー | 不可 | 可能(count指定) |
| ディスクイメージ | 不可 | 可能 |
| パーミッション | 保持可能 | ビットレベルで完全コピー |
注意点
危険性:ddは非常に強力ですが、誤った指定でシステム全体を破壊する可能性があります。of=(出力先)の指定には細心の注意が必要です。
推奨使用場面
- ディスク全体のバックアップ
- ブータブルUSBの作成
- パーティションのクローン
- MBRのバックアップ
- ディスクの完全消去
5. tar:アーカイブとコピーの統合
tarは、複数のファイルを一つのアーカイブにまとめるコマンドですが、パイプと組み合わせることで効率的なコピーツールとしても使用できます。
特徴
- 対象:ファイル・ディレクトリ
- 速度:高速
- 機能:アーカイブ、圧縮、属性保持
- 用途:バックアップ、移動、複製
コピーツールとしての使用例
# ディレクトリを完全にコピー(属性保持)
tar cf - /source/dir | tar xf - -C /destination/
# リモートサーバーへコピー
tar czf - /local/dir | ssh user@remote "tar xzf - -C /remote/path/"
# リモートからローカルへコピー
ssh user@remote "tar czf - /remote/dir" | tar xzf - -C /local/path/
# 進捗表示付き(pvコマンド併用)
tar cf - /source/dir | pv | tar xf - -C /destination/
# 特定ファイルを除外してコピー
tar --exclude='*.log' -cf - /source/ | tar xf - -C /destination/
アーカイブとしての基本例
# アーカイブ作成(gzip圧縮)
tar czf backup.tar.gz /path/to/directory/
# アーカイブ作成(bzip2圧縮)
tar cjf backup.tar.bz2 /path/to/directory/
# アーカイブ作成(xz圧縮)
tar cJf backup.tar.xz /path/to/directory/
# アーカイブ展開
tar xzf backup.tar.gz
# 内容確認
tar tzf backup.tar.gz
# 特定ファイルのみ展開
tar xzf backup.tar.gz file1.txt
主要オプション
-c:アーカイブ作成-x:アーカイブ展開-t:内容表示-f:ファイル名指定-z:gzip圧縮/展開-j:bzip2圧縮/展開-J:xz圧縮/展開-v:詳細表示-C:展開先ディレクトリ指定--exclude:除外パターン指定
推奨使用場面
- 完全なディレクトリコピー(属性保持)
- リモートサーバーへの効率的な転送
- バックアップアーカイブの作成
- 権限とタイムスタンプの完全保持
6. pv:進捗表示ツール
pv(Pipe Viewer)は、パイプを通過するデータの進捗を視覚化するツールです。他のコマンドと組み合わせて使用します。
特徴
- 進捗率、転送速度、推定残り時間を表示
- 任意のコマンドのパイプに挿入可能
- 転送状況のリアルタイム監視
使用例
# ファイルコピーの進捗表示
pv file.iso > /destination/file.iso
# ddと組み合わせ
pv /dev/sda | dd of=/dev/sdb bs=4M
# tarと組み合わせ
tar cf - /source/dir | pv | tar xf - -C /destination/
# 圧縮と組み合わせ
pv file.txt | gzip > file.txt.gz
# ファイルサイズを指定して進捗表示を正確に
pv -s 10G large_file.iso > /destination/large_file.iso
# 転送速度制限
pv -L 10m file.iso > /destination/file.iso
# ネットワーク転送の監視
tar czf - /dir | pv | ssh user@remote "tar xzf - -C /path/"
主要オプション
-p:進捗率表示-t:経過時間表示-e:推定残り時間表示-r:転送速度表示-b:転送バイト数表示-s SIZE:データサイズ指定-L RATE:転送速度制限
7. nc (netcat):ネットワーク転送
ncは、TCPやUDP接続を利用してデータを送受信するツールです。シンプルなファイル転送にも使用できます。
特徴
- 暗号化なしの高速転送
- 最小限のプロトコルオーバーヘッド
- SSH設定不要
- セキュリティなし(注意が必要)
使用例
# 受信側(ファイルを受け取る)
nc -l -p 9999 > received_file.txt
# 送信側(ファイルを送る)
nc receiver_ip 9999 < file.txt
# ディレクトリ転送(tar併用)
# 受信側
nc -l -p 9999 | tar xzf -
# 送信側
tar czf - /directory | nc receiver_ip 9999
# 進捗表示付き(pv併用)
# 受信側
nc -l -p 9999 | pv | tar xzf -
# 送信側
tar czf - /dir | pv | nc receiver_ip 9999
推奨使用場面
- 信頼できるネットワーク内での高速転送
- 一時的なファイル共有
- SSH設定が困難な環境
- セキュリティが問題にならない状況
注意:ncは暗号化されていないため、機密データの転送には不適切です。
パフォーマンス比較とベンチマーク
速度比較(ローカルコピー)
一般的な1GBのディレクトリ(多数の小ファイル)をコピーする場合の相対的な速度:
| コマンド | 初回コピー速度 | 2回目以降 | 備考 |
|---|---|---|---|
| cp -a | 基準(100%) | 同じ | 最も高速 |
| rsync -a | 80-90% | 非常に高速 | 差分のみ転送 |
| tar | tar | 90-95% | 同じ | 属性完全保持 |
| dd | N/A | N/A | ファイル単位では非効率 |
速度比較(リモートコピー)
| コマンド | 初回転送 | 2回目以降 | 暗号化 |
|---|---|---|---|
| scp | 基準(100%) | 同じ | あり |
| rsync -avz | 90-95% | 非常に高速 | あり(SSH経由) |
| tar | ssh | tar | 95-100% | 同じ | あり |
| nc | 150-200% | 同じ | なし |
リソース使用量比較
| コマンド | CPU使用率 | メモリ使用量 | I/O負荷 |
|---|---|---|---|
| cp | 低 | 最小 | 中 |
| rsync | 中 | 中 | 中~高 |
| scp | 中~高 | 中 | 中 |
| dd | 低 | 最小 | 高 |
| tar | 低~中 | 最小 | 中 |
最適なコマンドの選び方
シナリオ別推奨コマンド
ローカルでの単純コピー
- cp -a:最高速、シンプル
- rsync -a:進捗表示や除外設定が必要な場合
- tar | tar:属性を確実に保持したい場合
定期的なバックアップ
- rsync -av --delete:差分同期が最適
- tar + 圧縮:アーカイブとして保存する場合
リモートサーバーへの転送
- rsync -avz:差分転送と圧縮が有効
- tar | ssh | tar:初回の完全転送
- scp(非推奨):レガシーシステムのみ
ディスクイメージ作成
- dd bs=4M status=progress:ディスク全体
- tar:ファイルシステムレベルのバックアップ
大容量ファイルの高速転送
- nc(セキュアなネットワーク内):最速
- rsync --bwlimit(制限が必要な場合)
- pv | ssh:進捗確認が必要な場合
用途別推奨一覧表
| 用途 | 推奨コマンド | 理由 |
|---|---|---|
| ローカルの単純コピー | cp -a | 最高速、シンプル |
| 大規模ディレクトリの初回コピー | cp -a / tar | 高速な全体コピー |
| 定期バックアップ | rsync -av --delete | 差分同期で効率的 |
| リモート同期 | rsync -avz | 差分転送と圧縮 |
| 単発リモート転送 | rsync / tar+ssh | 効率的かつ安全 |
| ディスククローン | dd bs=4M | ビットレベルコピー |
| ブータブルUSB作成 | dd bs=4M status=progress | イメージの直接書き込み |
| 進捗確認が必要 | rsync --progress / pv | リアルタイム監視 |
| 高速ネットワーク転送 | nc(信頼できる環境) | 最小オーバーヘッド |
| アーカイブ作成 | tar + 圧縮 | 複数ファイルを1つに |
実用的な使用例とベストプラクティス
1. 大規模ディレクトリのバックアップ
# 初回バックアップ(cpで高速コピー)
cp -av /data /backup/data-$(date +%Y%m%d)
# 定期バックアップ(rsyncで差分同期)
rsync -av --delete /data/ /backup/data-latest/
# リモートサーバーへのバックアップ
rsync -avz --delete /data/ user@backup-server:/backup/data/
2. サーバー移行
# 方法1: tar + ssh(完全な属性保持)
tar czf - /var/www | ssh newserver "tar xzf - -C /"
# 方法2: rsync(中断可能、再開可能)
rsync -avz --progress /var/www/ user@newserver:/var/www/
# 方法3: 進捗表示付き
tar cf - /var/www | pv | ssh newserver "tar xf - -C /"
3. ディスククローン作成
# ディスク全体をクローン
dd if=/dev/sda of=/dev/sdb bs=64M status=progress
# イメージファイルとして保存
dd if=/dev/sda bs=4M status=progress | gzip > disk-image.img.gz
# イメージから復元
gunzip -c disk-image.img.gz | dd of=/dev/sda bs=4M status=progress
4. 除外設定を使ったコピー
# rsyncで特定ファイルを除外
rsync -av \
--exclude='*.log' \
--exclude='*.tmp' \
--exclude='.git/' \
/source/ /destination/
# 除外リストファイルを使用
rsync -av --exclude-from=exclude.txt /source/ /destination/
# exclude.txtの内容例
*.log
*.tmp
.git/
node_modules/
__pycache__/
5. 帯域制限付き転送
# rsyncで帯域制限(KB/s)
rsync -av --bwlimit=1000 /source/ user@remote:/destination/
# scpで帯域制限(Kbit/s)
scp -l 8000 large_file.iso user@remote:/path/
# pvで転送速度制限(MB/s)
pv -L 10m file.iso > /destination/file.iso
6. 並列コピーによる高速化
# GNU parallelを使った並列コピー
find /source -type f | parallel -j 4 cp {} /destination/
# rsyncのマルチスレッド化(複数のrsyncを並行実行)
# ディレクトリごとに分割してコピー
for dir in /source/*/; do
rsync -av "$dir" /destination/ &
done
wait
注意点とトラブルシューティング
よくある問題と対処法
1. cpでのディレクトリコピーの罠
# 間違い:末尾のスラッシュに注意
cp -r /source/dir /destination/
# 結果:/destination/dir が作成される
cp -r /source/dir/ /destination/
# 結果:/destination/dir が作成される(同じ)
# rsyncの場合は挙動が異なる
rsync -av /source/dir /destination/
# 結果:/destination/dir が作成される
rsync -av /source/dir/ /destination/
# 結果:/source/dir の中身が /destination/ 直下にコピー
2. パーミッションの保持
# パーミッションを保持してコピー
cp -p file.txt /destination/ # 単一ファイル
cp -a /source/ /destination/ # ディレクトリ全体
rsync -a /source/ /destination/ # パーミッション、所有者、タイムスタンプ保持
tar cf - /source | tar xf - -C /destination/ # 完全保持
3. ディスク容量不足
# コピー前に容量確認
df -h /destination
# ファイルサイズ確認
du -sh /source
# rsyncのドライラン(実際にはコピーしない)
rsync -avn /source/ /destination/
4. シンボリックリンクの取り扱い
# リンク先をコピー
cp -L link /destination/
# リンク自体をコピー
cp -d link /destination/
# rsyncでリンクを保持
rsync -al /source/ /destination/
セキュリティとベストプラクティス
- scpは避ける:rsyncやsftpを使用する
- ncは信頼できるネットワークのみ:暗号化なし
- ddは慎重に:出力先の指定ミスに注意
- バックアップ前に確認:dry-runオプションを活用
- 重要データは複数箇所に:3-2-1ルール(3コピー、2種類のメディア、1つはオフサイト)
まとめ
コマンド選択の決定版フローチャート
- ディスク全体をコピーする? → YES:
dd - リモートサーバーへコピー? → YES:
rsync -avz - 定期的な同期が必要? → YES:
rsync -av --delete - アーカイブとして保存? → YES:
tar + 圧縮 - ローカルの単純コピー? → YES:
cp -a
重要なポイント
- cp:シンプルで高速、ローカルコピーの基本
- rsync:多機能で効率的、バックアップと同期に最適
- dd:低レベルコピー、ディスクイメージ作成に特化
- tar:アーカイブとコピーを統合、属性完全保持
- scp:非推奨、rsyncへ移行推奨
- pv:進捗表示に便利な補助ツール
- nc:高速だがセキュリティなし
現代的なベストプラクティス
- ローカルコピーはcpが最速:シンプルなタスクに最適
- リモート・バックアップはrsync:差分同期の効率性
- ディスクイメージはdd:ビットレベルの完全コピー
- scpは使わない:セキュリティ上の理由でrsyncへ移行
- 進捗確認が必要ならpvを併用:視覚的なフィードバック
適切なコピーコマンドを選択することで、作業効率の向上、ネットワーク帯域の節約、システムリソースの最適化が実現できます。この記事を参考に、それぞれの状況に最適なコピー方法を選択してください。