通过16个实例掌握 linux cp 命令

作为 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

我的开源项目

酷瓜云课堂-在线教育解决方案

你可能感兴趣的:(linuxcp)