linux-cp-command-tourial
作為 Linux 使用者,複制檔案和目錄是最常見的日常操作任務之一。cp 指令用于通過指令行将檔案和目錄從一個本地複制到另一個本地。cp 指令在幾乎所有 Unix 和 Linux 類作業系統中都可用。
在本文中,我們将為 linux 初學者示範 16 個有用的 cp 指令示例。
下面是 cp 指令的基本文法:
将一個檔案複制到另一個檔案
# cp {options} source_file target_file
複制檔案到另一個目錄或檔案夾
# cp {options} source_file target_directory
将目錄複制到目錄
# cp {options} source_directory target_directory
1) 将檔案複制到目标目錄
假設我們複制 /etc/passwd 檔案到 /mnt/backup 目錄
root@linuxtechi:~# cp /etc/passwd /mnt/backup/
root@linuxtechi:~#
使用以下指令驗證是否已複制
root@linuxtechi:~# ls -l /mnt/backup/
total 4
-rw-r--r-- 1 root root 2410 Feb 3 17:10 passwd
root@linuxtechi:~#
2) 同時複制多個檔案
假設我們要複制多個檔案 (/etc/passwd,/etc/group,/etc/shadow) 到目标目錄 (/mnt/backup)
root@linuxtechi:~# cp /etc/passwd /etc/group /etc/shadow /mnt/backup/
root@linuxtechi:~#
3) 互動地複制檔案 (-i)
使用 -i 選項,将檔案互動地從一個地方複制到另一個地方,互動選項隻在目标目錄已經有相同的檔案時才有效,示例如下所示
root@linuxtechi:~# cp -i /etc/passwd /mnt/backup/
cp: overwrite '/mnt/backup/passwd'? y
root@linuxtechi:~#
在上面的指令中,必須手動輸入 y 以允許複制操作
4) 複制期間詳細輸出 (-v)
如果你想要 cp 指令的詳細輸出,那麼使用 -v 選項,示例如下所示
root@linuxtechi:~# cp -v /etc/fstab /mnt/backup/
'/etc/fstab' -> '/mnt/backup/fstab'
root@linuxtechi:~#
如果你想同時使用互動模式和詳細模式,那麼使用選項 -iv
root@linuxtechi:~# cp -iv /etc/fstab /mnt/backup/
cp: overwrite '/mnt/backup/fstab'? y
'/etc/fstab' -> '/mnt/backup/fstab'
root@linuxtechi:~#
5) 複制目錄或檔案夾 (-r or -R)
使用 -r 或者 -R 選項将目錄從一個目錄複制到另一個目錄,假設我們要将 Linuxtechi 使用者的 home 目錄複制到 /mn/backup
root@linuxtechi:~# cp -r /home/linuxtechi /mnt/backup/
root@linuxtechi:~#
在上述指令中,-r 選項将遞歸地複制檔案和目錄
驗證目标位置上 linuxtechi 目錄的内容
root@linuxtechi:~# ls -l /mnt/backup/linuxtechi/
total 24
drwxr-xr-x 2 root root 4096 Feb 3 17:41 data
-rw-r--r-- 1 root root 7 Feb 3 17:41 file_1.txt
-rw-r--r-- 1 root root 7 Feb 3 17:41 file_2.txt
-rw-r--r-- 1 root root 7 Feb 3 17:41 file_3.txt
-rw-r--r-- 1 root root 7 Feb 3 17:41 file_4.txt
-rw-r--r-- 1 root root 7 Feb 3 17:41 file_5txt
-rw-r--r-- 1 root root 0 Feb 3 17:41 file_5.txt
root@linuxtechi:~#
6) 拷貝時存檔檔案和目錄 (-a)
當複制目錄時,我們通常使用 -r 或 -R 選項,但我們可以使用 -a 選項來代替 -r 選項,它将在複制過程中存檔檔案和目錄,示例如下所示
root@linuxtechi:~# cp -a /home/linuxtechi /mnt/backup/
root@linuxtechi:~# ls -l /mnt/backup/linuxtechi/
total 24
drwxr-xr-x 2 root root 4096 Feb 3 17:41 data
-rw-r--r-- 1 root root 7 Feb 3 17:39 file_1.txt
-rw-r--r-- 1 root root 7 Feb 3 17:39 file_2.txt
-rw-r--r-- 1 root root 7 Feb 3 17:39 file_3.txt
-rw-r--r-- 1 root root 7 Feb 3 17:39 file_4.txt
-rw-r--r-- 1 root root 7 Feb 3 17:40 file_5txt
-rw-r--r-- 1 root root 0 Feb 3 17:39 file_5.txt
root@linuxtechi:~#
7) 僅當源檔案比目标檔案更新時進行複制 (-u)
在某些情況下,隻有當源檔案比目标檔案更新時才需要複制檔案。這可以使用 cp 指令中的 -u 選項輕松實作。
In the Example:6 we have copied the linuxtechi home directory to
/mnt/backup folder, in the linuxtechi home folder we have 5 txt files,
let’s edit couple of them and then copy all the txt files using “cp -u”.
在示例 6 中,我們将 linuxtechi 家目錄複制到 /mnt/backup 檔案夾,在 linuxtechi 主檔案夾中,我們有 5 個 txt 檔案,我們編輯它們中的幾個,然後使用 cp -U 指令複制所有 txt 檔案。
root@linuxtechi:~# cd /home/linuxtechi/
root@linuxtechi:/home/linuxtechi# echo "LinuxRocks" >> file_1.txt
root@linuxtechi:/home/linuxtechi# echo "LinuxRocks" >> file_4.txt
root@linuxtechi:/home/linuxtechi# cp -v -u file_*.txt /mnt/backup/linuxtechi/
'file_1.txt' -> '/mnt/backup/linuxtechi/file_1.txt'
'file_4.txt' -> '/mnt/backup/linuxtechi/file_4.txt'
root@linuxtechi:/home/linuxtechi#
8) 複制時不覆寫現有檔案 (-n)
在某些情況下,您不希望在複制時覆寫現有目标檔案,可以使用 -n 選項來完成
root@linuxtechi:~# cp -i /etc/passwd /mnt/backup/
cp: overwrite '/mnt/backup/passwd'?
正如你在上面的指令中看到的,它會提示我們覆寫現有的檔案,如果你使用 -n 選項,那麼它将不會提示覆寫,也不會覆寫現有的檔案。
root@linuxtechi:~# cp -n /etc/passwd /mnt/backup/
root@linuxtechi:~#
9) 使用 cp 指令建立軟連結 (-s)
假設要建立檔案的軟連結,而不是進行複制,這種情況下使用 cp 指令中的 -s 選項,示例如下所示
root@linuxtechi:~# cp -s /home/linuxtechi/file_1.txt /mnt/backup/
root@linuxtechi:~# cd /mnt/backup/
root@linuxtechi:/mnt/backup# ls -l file_1.txt
lrwxrwxrwx 1 root root 27 Feb 5 18:37 file_1.txt -> /home/linuxtechi/file_1.txt
root@linuxtechi:/mnt/backup#
10) 使用 cp 指令建立硬連結 (-l)
假設要建立檔案的硬連結,而不是複制,那麼使用 -l 選項,示例如下所示
root@linuxtechi:~# cp -l /home/linuxtechi/devops.txt /mnt/backup/
root@linuxtechi:~#
在硬連結中,源檔案和目标檔案具有相同的 inode 号,讓我們使用以下指令來驗證這一點
root@linuxtechi:~# ls -li /mnt/backup/devops.txt
918196 -rw-r--r-- 2 root root 37 Feb 5 20:02 /mnt/backup/devops.txt
root@linuxtechi:~# ls -li /home/linuxtechi/devops.txt
918196 -rw-r--r-- 2 root root 37 Feb 5 20:02 /home/linuxtechi/devops.txt
root@linuxtechi:
11) 将屬性從源複制到目标 (–attributes-only)
如果希望使用 cp 指令僅将屬性從源複制到目标,則使用選項 -attributes-only
# cp --attributes-only /home/linuxtechi/distributions.txt /mnt/backup/
# ls -l /home/linuxtechi/distributions.txt
-rw-r--r-- 1 root root 41 Feb 5 19:31 /home/linuxtechi/distributions.txt
# ls -l /mnt/backup/distributions.txt
-rw-r--r-- 1 root root 0 Feb 5 19:34 /mnt/backup/distributions.txt
#
在上面的指令中,我們從 linuxtechi 主目錄複制到 /mnt/backup 目錄,僅複制屬性,然後跳過内容。 /mnt/backup/distribution.txt 檔案大小為零位元組。
12) 複制時建立現有目标檔案的備份 (–backup)
cp 指令的預設行為是如果存在相同的檔案,則覆寫目标檔案,如果您想在複制操作期間備份現有的目标檔案,則使用 -backup 選項,示例如下所示
root@linuxtechi:~# cp --backup=simple -v /home/linuxtechi/distributions.txt /mnt/backup/distributions.txt
'/home/linuxtechi/distributions.txt' -> '/mnt/backup/distributions.txt' (backup: '/mnt/backup/distributions.txt~')
root@linuxtechi:~#
如果您注意到,備份已經建立,并在檔案末尾追加了波浪号符号。備份選項接受以下參數
- none, off – never make backups
- numbered, t – make numbered backups
- existing, nil – numbered if numbered backups exist, simple otherwise
- simple, never – always make simple backups
13) 複制時保留模式、所有權和時間戳 (-p)
如果你想在複制時保留檔案屬性,如模式、所有權和時間戳,那麼在 cp 指令中使用 -p 選項,示例如下所示
root@linuxtechi:~# cd /home/linuxtechi/
root@linuxtechi:/home/linuxtechi# cp -p devops.txt /mnt/backup/
root@linuxtechi:/home/linuxtechi# ls -l devops.txt
-rw-r--r-- 1 root root 37 Feb 5 20:02 devops.txt
root@linuxtechi:/home/linuxtechi# ls -l /mnt/backup/devops.txt
-rw-r--r-- 1 root root 37 Feb 5 20:02 /mnt/backup/devops.txt
root@linuxtechi:/home/linuxtechi#
14) 複制時不要遵循源符号連結 (-P)
如果您不想在複制時遵循源符号連結,則在指令中使用 -P 選項,示例如下所示
root@linuxtechi:~# cd /home/linuxtechi/
root@linuxtechi:/home/linuxtechi# ls -l /opt/nix-release.txt
lrwxrwxrwx 1 root root 14 Feb 9 12:28 /opt/nix-release.txt -> os-release.txt
root@linuxtechi:/home/linuxtechi#
root@linuxtechi:/home/linuxtechi# cp -P os-release.txt /mnt/backup/
root@linuxtechi:/home/linuxtechi# ls -l /mnt/backup/os-release.txt
-rw-r--r-- 1 root root 35 Feb 9 12:29 /mnt/backup/os-release.txt
root@linuxtechi:/home/linuxtechi#
15) 強制複制檔案和目錄 (-f)
在某些情況下,現有的目标檔案無法打開和删除。如果你有一個健康的檔案,可以複制到現有的目标檔案,那麼使用 cp 指令的 -f 選項
root@linuxtechi:/home/linuxtechi# cp -f distributions.txt /mnt/backup/
root@linuxtechi:/home/linuxtechi#
16) 複制稀疏檔案
稀疏檔案是一個正常檔案,它包含一個零位元組的長序列,不消耗任何實體磁盤塊。稀疏檔案的好處之一是它不會消耗太多的磁盤空間,并且對該檔案的讀取操作将非常快。
假設我們有一個命名為 ubuntu-cloud.img 的稀疏雲鏡像
root@linuxtechi:/home/linuxtechi# du -sh ubuntu-cloud.img
12M ubuntu-cloud.img
root@linuxtechi:/home/linuxtechi# cp --sparse=always ubuntu-cloud.img /mnt/backup/
root@linuxtechi:/home/linuxtechi# du -sh /mnt/backup/ubuntu-cloud.img
0 /mnt/backup/ubuntu-cloud.img
root@linuxtechi:/home/linuxtechi#
在 cp 指令中使用稀疏參數時,可以使用不同的選項
- sparse=auto
- sparse-always
- sparse=never
我的開源項目
- course-tencent-cloud(酷瓜雲課堂 - gitee 倉庫)
- course-tencent-cloud(酷瓜雲課堂 - github 倉庫)