cp — 複製檔案與目錄

複製檔案或目錄到指定位置。

語法

cp [選項] 來源... 目的地

常用選項

選項 說明 範例
-r, -R, --recursive 遞迴複製目錄及其所有內容 cp -r src/ dest/
-i, --interactive 覆蓋前詢問確認,避免意外覆寫 cp -i file1 file2
-p, --preserve 保留原始檔案的權限、時間戳記、擁有者等屬性 cp -p file1 file2
-a, --archive 等同 -dpR,歸檔模式,完整保留所有屬性並遞迴複製 cp -a src/ backup/
-u, --update 只複製來源比目的地新,或目的地不存在的檔案 cp -u *.txt dest/
-v, --verbose 顯示正在複製的每個檔案 cp -rv src/ dest/
-f, --force 強制覆蓋目的地檔案,不詢問 cp -f file1 file2
-n, --no-clobber 不覆蓋已存在的目的地檔案 cp -n file1 file2
-l, --link 建立硬連結而非複製(節省空間) cp -l file1 file2
-s, --symbolic-link 建立符號連結而非複製 cp -s /abs/path link

使用範例

範例 1:複製單一檔案

將 report.txt 複製為 report_backup.txt(兩檔都存在於當前目錄)。

$ cp report.txt report_backup.txt
範例 2:複製檔案到目錄

將 notes.txt 複製到 ~/Documents/ 目錄下,檔名不變。

$ cp notes.txt ~/Documents/
範例 3:遞迴複製整個目錄

使用 -r 複製整個目錄樹,包含所有子目錄與檔案。

$ cp -r project/ project_backup/
範例 4:歸檔模式複製(保留所有屬性)

使用 -a(等同 -dpR)複製時完整保留權限、擁有者、時間戳記,適合備份用途。

$ cp -a /var/www/html/ /backup/html-$(date +%Y%m%d)/
範例 5:互動模式(避免覆蓋)

使用 -i 在即將覆蓋已存在的目的地檔案時詢問確認。

$ cp -i config.yml /etc/app/config.yml
cp: overwrite '/etc/app/config.yml'? 
輸入 y 確認覆蓋,n 跳過。
範例 6:批次複製多個檔案

使用 glob 樣式一次複製多個符合條件的檔案到目的地目錄。

$ cp *.log /var/archive/
範例 7:詳細模式複製(顯示進度)

加上 -v 可看到每個被複製的檔案,適合複製大量檔案時確認進度。

$ cp -rv /etc/nginx/ ~/nginx-backup/
'/etc/nginx/nginx.conf' -> '/home/user/nginx-backup/nginx.conf'
'/etc/nginx/sites-enabled/default' -> '/home/user/nginx-backup/sites-enabled/default'

常見錯誤與排錯

cp: -r not specified; omitting directory 'dirname'
原因
嘗試複製目錄但未加 -r 選項。
解法
加上 -r 或 -a 選項進行遞迴複製。
cp: cannot create regular file 'dest': Permission denied
原因
對目的地路徑沒有寫入權限。
解法
使用 sudo cp 或調整目的地目錄權限(chmod/chown)。
cp: cannot stat 'source': No such file or directory
原因
來源檔案不存在,或路徑輸入錯誤。
解法
先用 ls 確認來源檔案存在,或檢查路徑拼字是否正確。

延伸閱讀