如何在 Linux 和 Unix 中复制文件?10 个cp 命令示例
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
- 点赞
- 收藏
- 关注作者
评论(0)