众力资讯网

每天一个 Linux 知识:cp 和 mv 命令

cp 命令cp命令的全称是 “copy”,核心功能是复制文件或目录到指定位置。它不仅能复制单个文件,还支持批量复制、目录

cp 命令

cp命令的全称是 “copy”,核心功能是复制文件或目录到指定位置。它不仅能复制单个文件,还支持批量复制、目录递归复制,甚至可以保留文件的权限、时间戳等属性,是数据备份和文件迁移的核心工具。

cp命令的基本格式分为两种场景,分别对应“复制文件”和“复制目录”:

复制文件cp [选项] 源文件路径 目标路径/目标文件名 源文件路径:可以是单个文件(如file.txt)、多个文件(如a.txt b.jpg),或通过通配符匹配的批量文件(如*.pdf)。目标路径:若目标路径是已存在的目录,源文件会被复制到该目录下,文件名保持不变;若目标路径是新文件名(如new_file.txt),则会复制并重命名源文件。复制目录

由于目录包含嵌套的文件和子目录,复制目录必须添加-r(或-R,即 “recursive”,递归)选项,否则cp会报错“Is a directory”:

cp -r [选项] 源目录路径 目标目录路径 cp 命令的核心选项

cp命令的选项丰富,不同选项组合可满足多样化的复制需求。

(1)复制单个文件(无选项基础用法)

这是cp最基础的用法,适用于将单个文件复制到指定目录或重命名。

例如:

将当前目录的note.txt复制到/tmp目录(文件名保持不变):cp note.txt /tmp

将note.txt复制到/tmp目录,并改名为backup.txt:cp note.txt /tmp/backup.txt

执行后可通过ls /tmp查看复制结果,确认文件是否存在。

(2)批量复制文件(通配符 + 多文件)

若需复制多个同类文件,无需逐个指定,可结合通配符(如*、?)或直接列出文件名。

例如:

复制当前目录下所有.md格式的文件到docs目录:cp *.md docs 复制a.txt、b.jpg、c.pdf三个文件到/home/user/files目录:cp a.txt b.jpg c.pdf /home/user/files

注意:若目标目录不存在,直接执行上述命令会报错,需先通过mkdir -p创建目录。

(3)递归复制目录(-r 选项)

复制目录时必须添加-r选项,否则cp无法识别目录结构。

例如:

将当前目录的photos目录(包含子目录和图片文件)完整复制到/backup目录:cp -r photos /backup

执行后/backup目录下会生成photos子目录,且内部文件结构与源目录完全一致。若目标目录已存在(如/backup下已有photos),默认会将源目录的内容合并到目标目录中,不会覆盖整个目录(需注意文件重名时的覆盖问题)。

(4)保留文件属性(-p 选项)

默认情况下,cp复制文件时会使用当前系统时间作为新文件的时间戳,且权限会继承目标目录的默认权限(受umask影响)。若需保留源文件的权限(如rwxr-xr--)、时间戳(atime、mtime)和所有者信息,需添加-p选项(p 即 “preserve”,保留)。

例如:

复制data.csv到/tmp目录,并保留其原始属性:cp -p data.csv /tmp

通过ls -l data.csv和ls -l /tmp/data.csv对比,可发现两个文件的权限、时间戳完全一致,这在备份系统配置文件(如/etc/profile)时尤为重要。

(5)强制覆盖与交互确认(-f / -i 选项)

当目标路径已存在同名文件时,cp的默认行为因系统配置而异(部分 Linux 发行版默认提示确认,部分直接覆盖)。

通过以下选项可主动控制覆盖逻辑:

-f(force,强制):直接覆盖目标文件,不提示确认(适用于批量复制且确认无需保留目标文件的场景):cp -f report.pdf /tmp # 若/tmp/report.pdf已存在,直接覆盖 -i(interactive,交互):覆盖前先提示确认,输入y确认覆盖,n跳过(适用于避免误删重要文件的场景):cp -i report.pdf /tmp # 执行后会提示:cp: overwrite '/tmp/report.pdf'?

建议日常操作优先使用-i选项,降低误操作风险。

(6)显示复制进度(-v 选项)

当复制大文件或大量文件时,无法直观判断复制进度,此时可添加-v选项(verbose,详细模式),让cp实时输出复制的文件路径。

例如:

cp -v -r photos /backup # 输出示例:'photos/img1.jpg' -> '/backup/photos/img1.jpg'

通过输出信息,可清晰了解当前复制进度,避免因长时间无响应误以为命令卡死。

mv 命令

mv命令的全称是 “move”,核心功能有两个:移动文件/目录到指定位置、重命名文件/目录。与cp不同,mv不会复制文件内容,仅通过修改文件系统的目录项(inode)实现位置变更,因此操作速度远快于复制大文件;同时,mv对目录操作无需递归选项,语法更简洁。

mv命令的语法与cp类似,但无需区分文件和目录(移动目录无需额外选项):

mv [选项] 源路径(文件/目录) 目标路径 若目标路径是已存在的目录:源文件/目录会被移动到该目录下,名称保持不变;若目标路径是新名称(且不存在同名文件/目录):源文件/目录会被重命名为目标名称;若目标路径是已存在的文件:默认会覆盖该文件(可通过选项控制)。mv 命令的核心选项

mv的选项较少,但每个选项都针对关键场景设计。

(1)重命名文件/目录(无选项基础用法)

这是mv最常用的场景之一,直接指定“源名称”和“目标名称”即可。

例如:

将当前目录的old_name.txt重命名为new_name.txt:mv old_name.txt new_name.txt

将docs目录重命名为documentation:mv docs documentation

注意:若目标名称已存在(如new_name.txt已存在),执行上述命令会直接覆盖目标文件(需谨慎操作)。

(2)移动文件/目录到指定目录

将文件或目录从当前位置移动到其他目录,目标路径需为已存在的目录。

例如:

将/tmp/report.pdf移动到/home/user/docs目录:mv /tmp/report.pdf /home/user/docs 将当前目录的photos目录和notes.txt文件同时移动到/backup目录:mv photos notes.txt /backup

执行后,源路径的文件/目录会消失,仅保留目标路径的副本(因mv不复制内容,仅移动位置)。

(3)交互确认覆盖(-i 选项)

与cp的-i选项类似,mv的-i选项会在覆盖目标文件前提示确认,避免误删重要数据。

例如:

mv -i report.pdf /home/user/docs # 若/home/user/docs/report.pdf已存在,会提示:mv: overwrite '/home/user/docs/report.pdf'?

输入y确认覆盖,n取消操作,这是日常使用mv的安全首选。

(4)强制覆盖与禁止覆盖(-f / -n 选项)-f(force):强制覆盖目标文件,不提示确认(适用于批量移动且明确无需保留目标文件的场景):mv -f *.log /var/log/old_logs # 强制覆盖/var/log/old_logs下的同名.log文件 -n(no clobber,不覆盖):禁止覆盖已存在的目标文件,若目标文件存在则跳过操作(适用于仅移动新文件的场景):mv -n /downloads/*.txt /home/user/docs # 仅移动/downloads下不存在于/docs的.txt文件

-n选项尤其适合定期整理下载目录,避免覆盖已有文件。