目录
8. shell命令--cp
功能说明
cp 是 Linux 和 Unix-like 系统中用于复制文件和目录的命令。cp命令来自英文单词copy的缩写,中文译为“复制”,其功能是复制文件或目录。cp命令能够将一个或多个文件或目录复制到指定位置,亦常用于文件的备份工作。-r参数用于递归操作,复制目录时若忘记添加则会直接报错;-f参数则用于当目标文件已存在时会直接覆盖而不再询问。这两个参数尤为常用。
语法格式
cp [选项] 源文件或目录 目标文件或目录
SYNOPSIS
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
选项说明
- -a 或 --archive:此选项用于递归方式复制,且尽可能保持文件属性,等于 dpR 参数组合
- -b 或 --backup[=CONTROL]:为每个要覆盖的文件创建备份。
- -d 或 --no-dereference:当复制符号链接时,把链接的目的地复制过来,而不是链接本身。
- -f 或 --force:如果目标文件已经存在,则强制覆盖它。
- -i 或 --interactive:在覆盖文件之前提示用户。
- -l 或 --link:对源文件创建硬链接,而非复制文件。
- -n 或 --no-clobber:不要覆盖已经存在的文件。
- -p 或 --preserve[=ATTRIBUTES]:保持原始文件的模式、所有权和时间戳。
- -r 或 -R 或 --recursive:递归复制目录及其内容。
- -s 或 --symbolic-link:对源文件创建符号链接,而非复制文件。
- -t, --target-directory=DIRECTORY: 指定目标目录。
- -u 或 --update:只当源文件比目标文件新,或目标文件不存在时,才复制源文件。
- -v, --verbose: 显示详细的操作信息。
实践操作
1. 无参数和带参数 -a 的比较
mkdir -p /test/cp #创建测试目录
cd /test/cp #切换到测试目录
touch file1 #创建文件 file1
ll #查看一下
date #查看当前时间,注意当前时间与文件 file1 创建的时间不一样即可,方便后面区分
cp file1 file2 #不使用参数复制文件
cp -a file1 file3 #使用参数 -a 递归方式复制,且尽可能保持文件属性
ll #对比结果,可以发现,有无参数对同一个文件复制的属性是不一样的
2. 使用 -i 参数的例子,(y 同意,n 不同意)
cp -i file2 file3 #参数 -i 提示是否覆盖文件,yes 表示确定,no 表示取消,可以简写
cp file2 file3 #没加参数 -i 为啥也有提示
cp -f file2 file3 #参数 -f 强制覆盖,但是也不行
alias cp #因为系统为 cp 做了别名,为防止误操作而覆盖源文件内容
\cp file2 file3 #取消别名
which cp #查看 cp 命令的绝对路径
/bin/cp file2 file3 #使用命令的绝对路径也可以取消别名
/usr/bin/cp file2 file3 #使用命令的绝对路径也可以取消别名
3. 使用 -r 参数复制目录
ls #查看一下
mkdir dir1 #创建目录 dir1
ls dir1 #查看一下目录 dir1
cp file1 dir1 #将文件 file1 复制到 dir1 目录里
ls #查看一下
ls dir1 #查看一下目录 dir1
cp file2 file3 dir1 #也可以一次将多个文件复制到 dir1 目录里
ls dir1 #查看一下目录 dir1
cp dir1 dir2 #先不加参数试试,提示:omitting directory 'dir1',意思就是没有复制成功
ls #不信可以查看看一下,那怎么解决?
cp -r dir1 dir2 #应为要复制目录,需要使用参数 -r
ls #发现有了目录 dir2
ls dir2 #查看一下目录 dir2
4. 快速备份文件案例
ls /etc/ssh/ |grep sshd #查看 /etc/ssh/ 目录下,以 sshd 为关键字的所有文件
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak #先正常备份一下
!ls #执行最近以 ls 开头的命令,发现复制成功了
cp /etc/ssh/sshd_config{,.bak1} #使用这种方法可以实现快速复制
!ls #再次查看一下
rm -f /etc/ssh/sshd_config.bak* #删除之前备份文件,需要谨慎操作,跳过也是可以的
!ls #查看一下
命令示例:1. 无参数和带参数 -a 的比较
mkdir -p /test/cp
cd /test/cp
touch file1
ll
date
cp file1 file2
cp -a file1 file3
ll
输出结果:
[root@MineGi ~]# mkdir -p /test/cp
[root@MineGi ~]# cd /test/cp
[root@MineGi /test/cp]# touch file1
[root@MineGi /test/cp]# ll
总用量 0
-rw-r--r-- 1 root root 0 11月 24 10:33 file1
[root@MineGi /test/cp]# date
2024年 11月 24日 星期日 10:34:33 CST
[root@MineGi /test/cp]# cp file1 file2
[root@MineGi /test/cp]# cp -a file1 file3
[root@MineGi /test/cp]# ll
总用量 0
-rw-r--r-- 1 root root 0 11月 24 10:33 file1
-rw-r--r-- 1 root root 0 11月 24 10:34 file2
-rw-r--r-- 1 root root 0 11月 24 10:33 file3
[root@MineGi /test/cp]#
命令示例:2. 使用 -i 参数的例子,(y 同意,n 不同意)
cp -i file2 file3
cp file2 file3
cp -f file2 file3
alias cp
\cp file2 file3
which cp
/bin/cp file2 file3
/usr/bin/cp file2 file3
输出结果:
[root@MineGi /test/cp]# cp -i file2 file3
cp:是否覆盖"file3"? n
[root@MineGi /test/cp]# cp file2 file3
cp:是否覆盖"file3"? n
[root@MineGi /test/cp]# cp -f file2 file3
cp:是否覆盖"file3"? n
[root@MineGi /test/cp]# alias cp
alias cp='cp -i'
[root@MineGi /test/cp]# \cp file2 file3
[root@MineGi /test/cp]# which cp
alias cp='cp -i'
/usr/bin/cp
[root@MineGi /test/cp]# /bin/cp file2 file3
[root@MineGi /test/cp]# /usr/bin/cp file2 file3
[root@MineGi /test/cp]#
命令示例:3. 使用 -r 参数复制目录
ls
mkdir dir1
ls dir1
cp file1 dir1
ls
ls dir1
cp file2 file3 dir1
ls dir1
cp dir1 dir2
ls
cp -r dir1 dir2
ls
ls dir2
输出结果:
[root@MineGi /test/cp]# ls
file1 file2 file3
[root@MineGi /test/cp]# mkdir dir1
[root@MineGi /test/cp]# ls dir1
[root@MineGi /test/cp]# cp file1 dir1
[root@MineGi /test/cp]# ls
dir1 file1 file2 file3
[root@MineGi /test/cp]# ls dir1/
file1
[root@MineGi /test/cp]# cp file2 file3 dir1
[root@MineGi /test/cp]# ls dir1
file1 file2 file3
[root@MineGi /test/cp]# cp dir1 dir2
cp: 略过目录"dir1"
[root@MineGi /test/cp]# ls
dir1 file1 file2 file3
[root@MineGi /test/cp]# cp -r dir1 dir2
[root@MineGi /test/cp]# ls
dir1 dir2 file1 file2 file3
[root@MineGi /test/cp]# ls dir2
file1 file2 file3
[root@MineGi /test/cp]#
命令示例:4. 快速备份文件案例
ls /etc/ssh/ |grep sshd
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
!ls
cp /etc/ssh/sshd_config{,.bak1}
!ls
rm -f /etc/ssh/sshd_config.bak*
!ls
输出结果:
[root@MineGi /test/cp]# ls /etc/ssh/ |grep sshd
sshd_config
[root@MineGi /test/cp]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
[root@MineGi /test/cp]# !ls
ls /etc/ssh/ |grep sshd
sshd_config
sshd_config.bak
[root@MineGi /test/cp]# cp /etc/ssh/sshd_config{,.bak1}
[root@MineGi /test/cp]# !ls
ls /etc/ssh/ |grep sshd
sshd_config
sshd_config.bak
sshd_config.bak1
[root@MineGi /test/cp]# rm -f /etc/ssh/sshd_config.bak*
[root@MineGi /test/cp]# !ls
ls /etc/ssh/ |grep sshd
sshd_config
[root@MineGi /test/cp]#
这只是 cp 命令的一些基本用法和选项。你可以通过 man cp 或 cp --help 命令查看更多详细信息和高级选项。
注意:使用 cp 命令时要小心,特别是在使用 -f 选项时,因为它会无条件地覆盖目标文件,而不会给出任何提示。