cp(copy)是 Linux 複製檔案與目錄的核心指令。掌握其豐富參數組合,能精確控制複製行為:保留權限時間戳、處理符號連結、覆蓋確認、稀疏檔案優化、大量資料斷點續傳等,是系統備份、部署發佈、資料遷移的基石操作。
cp [選項] 檔案1 檔案2 # 檔案複製為檔案
cp [選項] 檔案... 目錄 # 多檔案複製至目錄
cp [選項] -R 目錄1 目錄2 # 遞歸複製整個目錄樹
| 參數 | 長參數 | 功能說明 | 典型場景 |
|---|---|---|---|
-a | --archive | 歸檔模式 = -dR --preserve=all,完整保留屬性、遞歸、符號連結 | 系統備份、目錄完整複製 |
-r, -R | --recursive | 遞歸複製目錄及子目錄 | 目錄樹複製 |
-p | --preserve | 保留模式、擁有者、時間戳(預設 mode,ownership,timestamps) | 保留原始屬性 |
-d | --no-dereference | 複製符號連結本身而非指向目標 | 保留連結結構 |
-L | --dereference | 跟隨符號連結複製目標檔案 | 實體化連結 |
-f | --force | 強制覆蓋,不提示(若目標無寫權限先移除再建立) | 腳本自動化 |
-i | --interactive | 覆蓋前詢問確認 | 互動式操作防誤刪 |
-n | --no-clobber | 不覆蓋已存在檔案(靜默跳過) | 增量同步 |
-u | --update | 僅在來源較新或目標不存在時複製 | 增量備份、同步 |
-v | --verbose | 顯示詳細操作過程 | 進度監控 |
-l | --link | 建立硬連結而非複製 | 節省空間、瞬間完成 |
-s | --symbolic-link | 建立符號連結而非複製 | 快捷方式、版本切換 |
--sparse=auto | 自動偵測稀疏檔案(大量空洞),複製時保持稀疏 | 虛擬機映像、資料庫檔案 | |
--reflink=auto | 支援 Copy-on-Write 檔案系統(Btrfs、XFS、OCFS2)即時複製,零 IO | 秒級複製 TB 級資料 |
cp -av /etc /backup/etc-$(date +%F)
cp -auv /src/data/ /dst/backup/
cp -ad /opt/app/current /opt/app/backup-$(date +%F)
# 來源端
cd /src && tar cf - . | pv | (cd /dst && tar xf -)
# 或使用 rsync 更專業(支援斷點續傳、壓縮、校驗)
rsync -avz --progress /src/ /dst/
cp --sparse=always /var/lib/libvirt/images/vm.qcow2 /backup/
cp --reflink=auto /data/huge.db /data/huge.db.backup
# 瞬間完成,實際空間僅佔增量變更
| 工具 | 優勢 | 適用場景 |
|---|---|---|
cp | 內建、零依賴、參數精確控制 | 單機本地複製、腳本嵌入、小規模同步 |
rsync | 增量、壓縮、校驗、遠端、斷點續傳、權限保留 | 備份同步、跨機器遷移、生產環境標準 |
tar + 管道 | 保留完整屬性、串流傳輸、適配大量小檔案 | 大目錄樹遷移、系統打包、網路串流 |
cp a.txt b.txt c.txt 錯誤,必須 cp a.txt b.txt c.txt 目錄/。-d 時會跟隨連結複製目標實體,導致連結結構丟失。--reflink 在 ext4 上無效,需 Btrfs/XFS/OCFS2/ZFS(需核心支援)。cp -p 無法保留擁有者/群組,需 sudo cp -a。善用 cp -a 做完整備份、cp -u 做增量同步、--reflink 秒級複製大檔案,配合 rsync 處理跨機器與生產備份,構建分層資料複製策略。