天天看點

我不是網管 - Linux CP 指令,你真的會用嗎?

我不是網管 - Linux CP 指令,你真的會用嗎?

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

我的開源項目

我不是網管 - Linux CP 指令,你真的會用嗎?
  • course-tencent-cloud(酷瓜雲課堂 - gitee 倉庫)
  • course-tencent-cloud(酷瓜雲課堂 - github 倉庫)