Linux / 命令 / cp - 复制命令, mv - 移动命令
在 Linux 中,cp 用于复制文件或目录,mv 用于移动文件或目录或重命名它们。两个命令的结果取决于最终路径是否为现有目录,因此在执行前应检查目标路径。
复制与移动的区别
两个命令的基本格式是 cp source destination 和 mv source destination。复制会保留原始文件的单独副本,而移动或重命名在成功后会从原路径中移除该项目。以下示例基于 GNU coreutils 的 cp 和 mv。
现有文件可以被同名覆盖,因此在处理重要数据之前,请检查路径和目标内容并准备必要的备份。下面的操作在新创建的空目录中进行。
准备练习文件
以下是当当前目录中还不存在 cp-mv-practice 目录时的示例。如果已经存在同名目录,请在另一个空位置练习。如果第一个命令失败,请不要执行后续命令。
mkdir cp-mv-practice
cd cp-mv-practice
printf 'Hello Linux\n' > note.txt
mkdir target
ls
显示 note.txt 文件和一个空的 target 目录。随后示例将在此目录中按顺序执行。printf 的 > 会覆盖同名文件的内容,因此请在没有实际数据的位置使用。
复制文件
以下命令将 note.txt 复制到当前目录下的 copy.txt。如果成功,原文件和副本都会存在。
cp note.txt copy.txt
ls
cat copy.txt
cat 显示了副本 Hello Linux 的内容。以下命令将其复制到现有目录 target 中,并保留原始名称。
cp note.txt target/
ls target
如果指定的目标名称不是现有目录,则可能会创建一个同名文件或覆盖现有文件。因此,如果 target 是目录,cp note.txt target 会将文件复制到其中,但如果它不存在,将创建一个名为 target 的文件。要在目录内以不同名称复制它,请按 cp note.txt target/other.txt 所示指定完整目标路径。
复制目录
复制目录及其内容时,请使用递归选项 -r。以下命令将之前创建的 target 复制到 target-copy,该目录尚不存在。
cp -r target target-copy
ls target-copy
因此,会创建 target-copy/note.txt,而原始的 target/note.txt 保留不变。相反,如果目标目录已经存在,原始目录通常会被放置在其中。例如,再次执行 cp -r target target-copy 可能会创建 target-copy/target。在运行前使用 ls 检查目标。
GNU cp -a 在执行递归复制时会尽可能保留属性,例如链接、权限和时间戳。根据权限或目标文件系统的支持情况,并非所有属性都能保证被保留。符号链接的处理也会因选项而异,因此复制后请检查重要数据。更多细节,请参阅 GNU cp 手册。
移动和重命名文件
以下命令将之前创建的 copy.txt 重命名为 renamed.txt。如果成功,copy.txt 将消失,renamed.txt 将显示。
mv copy.txt renamed.txt
ls
接下来,将文件移动到现有目录。renamed.txt 在原始位置不再存在,并且 target/renamed.txt 已创建。
mv renamed.txt target/
ls target
在移动或重命名目录时,使用 mv,并且 cp 的 -r 不需要。如果目标目录已存在,则移动到其中;如果目标目录不存在,则使用指定名称移动。如果与现有非空目录冲突,可能会失败,因此不要假设它会像复制那样合并。
在不同的文件系统之间,GNU mv 可以通过复制后删除原文件来处理。大量数据可能需要时间,如果中途失败,可能只移动了部分数据,因此请检查双方的结果。您可以在 GNU mv 手册 中查看详细情况。
覆盖和路径错误检查
要在覆盖现有文件前收到确认,请使用 -i。以下是一个练习场景,其中一个同名文件已存在。当出现指令时,阅读指示并且仅在您打算覆盖时批准。
cp -i note.txt target/note.txt
mv -i 也会在替换现有目标文件之前进行询问。交互式确认不能替代自动化脚本中的冲突处理,因此在脚本中,应单独检查预期行为和退出状态。默认行为在命令被设为别名的环境中可能有所不同。
- 当路径中有空格时: 如
cp "my file.txt" "target/my file.txt"中所示,将每个路径用引号括起来。 - 当找不到文件或目录时: 使用
pwd和ls检查当前所在的位置、拼写和大小写。 - 当发生权限错误时: 请确认您对源文件具有读取权限,对目标位置具有写入权限,并在移动文件时检查源目录所需的权限。如果您没有权限,请向管理员申请。
在检查实际结果后,如有必要,可以使用文件管理工具删除 cp-mv-practice 目录。Midnight Commander 等工具,它们可以在查看文件列表的同时复制和移动文件,但是否在服务器上安装以及使用权限取决于具体环境。




