cp (copy) 是檔案/目錄複製的核心命令。除基本複製外,支援保留屬性 (-a/-p)、遞迴目錄 (-r)、建立連結 (-l/-s)、覆蓋提示 (-i/-n/-f)、備份既有檔 (--backup) 等進階功能。本文完整整理參數矩陣與實戰場景。

cp [選項]... [-T] 來源 目標
cp [選項]... 來源... 目標目錄
cp [選項]... -t 目標目錄 來源...
| 類別 | 參數 | 說明 |
|---|---|---|
| 保留屬性 | -a | 歸檔模式 = -dR --preserve=all (保留權限、擁有者、時間戳、連結、xattr 等) |
| -p | --preserve=mode,ownership,timestamps (預設保留三者) | |
| --preserve=屬性清單 | 可指定 mode,ownership,timestamps,links,xattr,context,all | |
| 覆蓋控制 | -i | 互動模式,覆蓋前詢問 (別名常設為 cp -i) |
| -n | --no-clobber | 不覆蓋既有檔 (優先於 -i) |
| -f | --force | 目標無法開啟時移除後重試 (不影響 -i/-n 邏輯) |
| --backup[=CONTROL] | 覆蓋前建立備份 (numbered/existing/simple/never) | |
| 連結處理 | -d | --no-dereference --preserve=links (複製連結本身而非指向檔案) |
| -l | --link | 建立硬連結而非複製 |
| -s | --symbolic-link | 建立符號連結 (捷徑) |
| -L | --dereference | 總是跟隨符號連結複製目標檔案 |
| -P | --no-dereference | 不跟隨符號連結 (預設) |
| 目錄處理 | -R, -r | --recursive 遞迴複製目錄及內容 |
| -H | 命令列參數的符號連結跟隨,其餘不跟隨 |
cp log.log test5/
# 不加 -a 時,目標檔案時間戳為當前時間
cp -a log.log test5/ # 保留原時間戳
cp log.log test5/ # 若有 alias cp='cp -i' 會詢問
cp -f log.log test5/ # 強制覆蓋 (但若有 -i alias 仍會詢問)
cp -n log.log test5/ # 不覆蓋,靜默跳過
# 解除 alias 後才真正生效
\cp -f log.log test5/
# 目標目錄存在:來源目錄複製「進入」目標目錄
cp -a test3 test5/ # 結果:test5/test3/
# 目標目錄不存在:來源目錄「重命名為」目標目錄
cp -a test3 test4 # 結果:test4/ (內容同 test3)
cp -s log.log log_link.log
# ls -l 顯示:log_link.log -> log.log
cp -l bigfile.dat bigfile_hardlink.dat
# 同一 inode,修改任一檔案內容同步變化
cp --backup=numbered -f config.ini config.ini
# 產生 config.ini.~1~, config.ini.~2~ ...
在 Shell 腳本中建議使用完整路徑 /bin/cp 或前置反斜線 \cp 繞過互動別名,確保自動化流程不卡住。
cp 參數極豐富,核心掌握 -a (完整保留)、-r (遞迴目錄)、-i/-n/-f (覆蓋策略)、-l/-s (連結類型) 四大面向即可應對絕大多數複製需求。生產環境腳本請明確指定覆蓋行為與屬性保留策略,避免資料遺失或權限異常。