如何在 Linux 和 Unix 中复制文件?10 个cp 命令示例

举报
Tiamo_T 发表于 2022/07/21 17:56:57 2022/07/21
【摘要】 cp 是 Linux 中的基本命令之一

cp 是 Linux 中的基本命令之一。您已经知道它用于将一个或多个文件或目录从源复制到目标。

虽然本教程适用于初学者,但也有助于大家使用一些实际示例快速查看各种 cp 命令选项。

即使您一直在使用 cp 命令,下面解释的一个或多个示例可能对您来说可能是新的。

复制命令的一般形式:

cp [option] source destination

1. 将文件或目录从源复制到目标

要复制文件,您需要将源和目标传递给复制命令。以下示例将文件从 project/readme.txt 复制到 projectbackup/readme-new.txt

$ cp project/readme.txt projectbackup/readme-new.txt

$ cd projectbackup/

$ ls
readme-new.txt

如果要将文件从一个文件夹复制到另一个具有相同名称的文件夹,只需目标目录名称就足够了,如下所示。

$ cp project/readme.txt projectbackup/

$ cd projectbackup/

$ ls
readme.txt

可以使用递归选项 -r 将目录(及其所有内容)从源复制到目标,如下所示:

$ ls project
src/  bin/  doc/  lib/  test/  readme.txt  LICENSE

$ cp -r project/ backup/

$ ls backup
src/  bin/  doc/  lib/  test/  readme.txt  LICENSE

2.复制多个文件或目录

您可以将多个文件从源复制到目标,如下所示:

$ cd src/
$ cp global.c main.c parse.c /home/tiamo/projectbackup/src/

如果源文件具有通用模式,请使用通配符,如下所示。在此示例中,所有 c 扩展文件都被复制到 /home/tiamo/projectbackup/src/ 目录。

$ cp *.c /home/tiamo/projectbackup/src/

复制多个目录,如下所示。

$ cd project/

$ cp -r src/ bin/ /home/tiamo/projectbackup/

3.复制到目的地之前的备份

如果目标文件已经存在同名,则 cp 允许您在覆盖目标文件之前对其进行备份。

在本例中,readme.txt 存在于 project/ 和 projectbackup/ 目录中,在将其从 project/ 复制到 projectbackup/ 时,会备份现有的 readme.txt,如下所示:

$ cd projectbackup

$ ls -l readme.txt
-rw-r--r-- 1 bala tt 1038 Jan  8 13:15 readme.txt

$ cd ../project 

$ ls -l readme.txt
-rw-r--r-- 1 bala tt 1020 Jan  8 12:25 readme.txt

$ cp --backup readme.txt  /home/tiamo/projectbackup/

现有文件已移至 readme.txt~ 并将新文件复制为 readme.txt,如下所示。

$ cd /home/tiamo/projectbackup/
$ ls -l
-rw-r--r-- 1 bala tt 1020 Jan  8 13:36 readme.txt
-rw-r--r-- 1 bala tt 1038 Jan  8 13:15 readme.txt~

谈到备份,您必须了解rsync 命令如何有效地备份文件。

4.复制时保留链接

执行 cp 命令时,如果源是链接文件,则复制实际文件而不是链接文件。如果您只想按原样复制链接,请指定选项 -d,如下所示:

下面显示如果没有选项 -d,它将复制文件(而不是链接):

$ cd project/bin

$ ls -l startup.sh
lrwxrwxrwx 1 root root 18 Jan  8 13:59 startup.sh -> ../test/startup.sh

$ cp startup.sh /home/tiamo/projectbackup/bin/

$ cd /home/tiamo/projectbackup/bin/

$ ls -l
-rw-r--r--  1 root root       102 Jan  8 14:02 startup.sh

要在复制时保留链接,请执行以下操作:

$ cd project/bin

$ cp -d startup.sh /home/tiamo/projectbackup/bin/

$ ls -l startup.sh
lrwxrwxrwx 1 root root 18 Jan  8 14:10 startup.sh -> ../test/startup.sh

5.不要覆盖现有文件

如果您只想在目标文件不存在时复制,请使用选项 -n,如下所示。这不会覆盖现有文件,并且 cp 命令将返回成功退出代码,如下所示:

$ cd projectbackup

$ ls -l readme.txt
-rw-r--r-- 1 bala tt 1038 Jan  8 13:15 readme.txt

$ cd ../project 

$ ls -l readme.txt
-rw-r--r-- 1 bala tt 1020 Jan  8 12:25 readme.txt

$ cp -n readme.txt /home/tiamo/projectbackup/bin/

$ echo $?
0

如下所示,目标文件没有被覆盖。

$ cd projectbackup

$ ls -l readme.txt
-rw-r--r-- 1 bala tt 1038 Jan  8 13:15 readme.txt

6. 覆盖前确认(交互模式)

当您使用 -i 选项时,它会在覆盖文件之前要求确认,如下所示。

$ cp -i readme.txt /home/tiamo/projectbackup/
cp: overwrite `/home/tiamo/projectbackup/readme.txt'? y

7.创建文件的硬链接(而不是复制)

执行 cp 命令时,可以创建文件的硬链接(而不是复制文件)。以下示例将 sample.txt 文件的硬链接创建到目录 test/ 中,

$ ls -li sample.txt
10883362 -rw-r--r-- 2 bala tt   1038 Jan  9 18:40 sample.txt

$ cp -l sample.txt test/ 

$ ls -li test/sample.txt
10883362 -rw-r--r-- 2 bala tt   1038 Jan  9 18:40 test/sample.txt

如上所示,test/sample.txt 是与 sample.txt 文件的硬链接文件,两个文件的 inode 相同。

8.创建指向文件或目录的软链接(而不是复制)

执行 cp 命令时,可以创建指向文件或目录的软链接。在以下示例中,为 libFS.so.6.0.0 创建了一个符号链接作为 libFS.so,

# cd /usr/lib/

# ls -l libFS.so.6.0.0
-rw-r--r-- 1 root root 42808 Nov 19  2010 libFS.so.6.0.0

# cp -s libFS.so.6.0.0 libFS.so

# ls -l libFS.so
lrwxrwxrwx 1 root root 14 Jan  9 20:18 libFS.so -> libFS.so.6.0.0

9. 复制时保留文件或目录的属性

使用 -p 选项,您可以保留文件或目录的属性,如下所示:

$ ls -l sample.txt
-rw-r--r-- 2 bala geek   1038 Jan  9 18:40 sample.txt

$ cp -p sample.txt test/ 

$ ls -l test/sample.txt
-rw-r--r-- 2 bala geek   1038 Jan  9 18:40 test/sample.txt

也可以只保留所需的属性,如模式、所有权、时间戳等,

以下示例在复制文件时保留文件的模式:

$ cp --preserve=mode sample.txt test/

10.仅当源文件比目标文件更新或丢失时复制

复制小文件不需要太多时间,但复制大文件可能需要相当长的时间。因此,在复制大文件时,您可能希望确保仅在源文件比目标文件更新时执行此操作,或者使用选项 -u 丢失目标文件时执行此操作,如下所示。

在这个例子中,两个文件 LICENSE 和 readme.txt 将从 project/ 复制到 projectbackup/。但是, LICENSE 文件已经存在于 projectbackup/ 目录中,并且比 project/ 目录中的要新。

$ cd project/

$ ls -l LICENSE readme.txt 
-rw-r--r-- 1 bala geek 108 Jan  8 13:14 LICENSE
-rw-r--r-- 1 bala geek 32 Jan  8 13:16 readme.txt

$ cd /home/tiamo/projectbackup/

$ ls -l LICENSE readme.txt 
ls: cannot access readme.txt: No such file or directory
-rw-r--r-- 1 root root 112 Jan  9 20:31 LICENSE

因此,在本例中,无需再次将 LICENSE 文件复制到 projectbackup/ 目录。如果您使用 -u 选项,则 cp 命令会自动处理这一点,如下所示。在下面的示例中,只有 readme.txt 文件被复制,如文件上的时间戳所示。

$ cp -u -v LICENSE readme.txt  /home/tiamo/projectbackup/
`readme.txt' -> `/home/tiamo/projectbackup/readme.txt'

$ cd /home/tiamo/projectbackup/

$ ls -l LICENSE readme.txt 
-rw-r--r-- 1 bala geek  112 Jan  9 20:31 LICENSE
-rw-r--r-- 1 bala geek   32 Jan  9 22:17 readme.txt
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。