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

茧型组合
• 阅读 987

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

我的开源项目

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

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Stella981 Stella981
3年前
Linux最常用150个命令汇总
Linux最常用150个命令汇总命令功能说明线上查询及帮助命令(2个)man查看命令帮助,命令的词典,更复杂的还有info,但不常用。help查看Linux内置命令的帮助,比如cd命令。文件和目录操作命令(18个)ls全拼list,功能是列出目录的内容及其内容属性信息。cd全拼
Stella981 Stella981
3年前
Python之OS模块函数
Python中的os模块提供了操作系统相关功能的函数,可以更加方便的在python脚本中对linux的文件目录的处理和shell的应用。os.system("bash")运行shell命令,直接显示应用ls命令查看当前目录下的文件importosprint(os.system('ls'))
Stella981 Stella981
3年前
Linux 使用cp命令的错误
昨天维护的编译软件出了一个奇怪的问题,功能大概是这样的:1、下载资源和代码;2、编译;3、将需要打包的文件复制到临时目录打包。后来由于新需求,修改了一下功能,在复制到临时目录之前还有回去一些资源到临时目录:2.5、下载三方资源到临时目录。增加此功能后错误就出现了,复制的临时目录的结构全乱了,比如:java/bin应复制到temp/
Stella981 Stella981
3年前
Linux企业运维人员最常用150个命令汇总
命令功能说明线上查询及帮助命令(2个)man查看命令帮助,命令的词典,更复杂的还有info,但不常用。help查看Linux内置命令的帮助,比如cd命令。文件和目录操作命令(18个)ls全拼list,功能是列出目录的内容及其内容属性信息。cd全拼change
Stella981 Stella981
3年前
Linux系统的基本操作
_20200727_Linux目录结构基本介绍Linux的文件系统是采用层级式的树状结构,在此结构中的最上层是/根目录tip1:在Linux世界里,一切皆是文件示例/bin:bin是Binary的缩写,这个目录存放着最经常使用的命令。
Wesley13 Wesley13
3年前
Java 程序员必须掌握的 Linux 命令
  作为一个Java开发人员,有些常用的Linux命令必须掌握。即时平时开发过程中不使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令。因为很多服务器上都是Linux系统。所以,要和服务器机器交互,就要通过shell命令。  本文并不会对所有命令进行详细讲解,只给出常见用法和解释。具体用法可以使用–help查看帮助或者直接通过goog
Stella981 Stella981
3年前
Linux下如何使cp命令不提示覆盖文件
在Linux下,如果希望将文件file拷贝到目录dir下,可以执行:cpfiledir但如果dir下已经存在一个名为file的文件的时候,系统总是会提示是否覆盖file。这是一个很好的功能,它能够防止我们由于疏忽对系统造成的损害,但如果不希望看到这些交互的提示信息呢?比如我们需要写一个脚本,将某些文件安装到指定的目录下,这时我们肯定不希
Stella981 Stella981
3年前
Linux神器strace的使用方法及实践
在Linux系统中,strace命令是一个集诊断、调试、统计与一体的工具,可用来追踪调试程序,能够与其他命令搭配使用,接下来就Linux系统调用工具strace的使用方法和实践给大家做个详细介绍,一起来了解下strace的操作实例吧。【场景】1、在操作系统运维中会出现程序或系统命令运行失败,通过报错和日志无法定位问题根因。
胖大海 胖大海
3年前
linux常用的通配符与正则表达式
我们在很多地方都会用到通配符和正则表达式来实现我们的日常操作,提高我们的工作效率。但是很多新伙伴,往往容易将他们弄混。首先我们需要知道通配符和正则表达式的使用场景:通配符也叫文件名替换,它主要是作用于匹配文件名,常用命令是ls、find、cp、mv;正则表达式主要是作用于匹配文件中的字符串或编写脚本,常用命令命令是grep、awk、sed。大家缺乏机器练手的
位流程风 位流程风
2个月前
Linux 重启命令全解析:深入理解与应用指南
在Linux系统中,掌握正确的重启命令是确保系统稳定运行和进行必要维护的关键技能。本文将深入解析Linux中常见的重启命令,包括功能、用法、适用场景及注意事项。一、reboot命令功能简介reboot是最常用的重启命令之一。它以优雅的方式关闭所有运行的进程