如何在 Linux 中复制文件和目录 [14 cp 命令示例]
简介:在本简单易懂的指南中,我们将讨论 cp 命令的一些实际示例。按照本指南操作后,用户将能够使用命令行界面在 Linux 中轻松复制文件和目录。
作为 Linux 用户,我们时常与文件和目录打交道。用户执行的一项常见操作是复制文件和目录。当然,我们可以使用图形文件管理器来执行复制操作。但是,大多数 Linux 用户更喜欢使用cp命令,因为它简单且功能丰富。
在本初学者指南中,我们将学习cp命令。顾名思义,cp 命令用于复制给定路径上的文件和目录。
通过本指南,我们将通过日常可使用的实际示例来了解cp 命令的用法。
那么让我们开始吧。
Cp 命令语法
cp命令的语法与其他 Linux 命令相同。从高层次上讲,它分为两部分 -选项和参数:
$ cp [OPTIONS] <SOURCE> <DEST> $ cp [OPTIONS] <SOURCE-1> <SOURCE-2> ... <DIRECTORY>
在上面的语法中,方括号([])
表示可选参数,而尖括号(<>)
表示强制参数。
1. 如何在 Linux 中复制文件
cp命令的基本用途之一是将文件复制到当前目录中。大多数情况下,用户执行此操作是为了备份重要的配置。
例如,我们经常在更新 SSH 配置之前创建/etc/ssh/sshd_config 文件的备份副本。
为了理解用法,让我们创建一个简单的文件:
$ touch file-1.txt
接下来,使用以下命令创建该文件的副本:
$ cp file-1.txt file-2.txt
2.显示复制命令进度
在上例中,我们使用ls 命令来验证文件复制操作是否成功。但是,为了验证前面命令的结果而再使用一个命令是没有意义的。
在这种情况下,我们可以使用该选项启用详细模式-v
,该选项为每个处理的文件提供诊断。
让我们使用以下命令复制 file -1.txt文件:
$ cp -v file-1.txt file-3.txt
在上面的输出中,箭头代表正在复制的文件。左侧参数是源文件,而右侧参数是目标文件。
3. 如何将多个文件复制到目录
到目前为止,我们只处理了一个文件和当前工作目录。然而,在实际生产环境中,我们必须处理大量文件。在这种环境中,常见的用例之一是将多个文件复制到一个目录中。
显然,我们可以多次执行 cp 命令来实现这一点,但这不是最有效的方式。为了有效地执行这样的操作,我们可以使用 cp 命令的替代语法。
因此,首先创建一个名为dir-1 的新目录:
$ mkdir dir-1
现在,让我们使用单个命令将所有三个文件复制到dir-1目录中:
$ cp -v file-1.txt file-2.txt file-3.txt dir-1
上面的输出显示所有文件都已复制到dir-1目录。另外,需要注意的是,要使用此替代语法,目录必须已经存在,并且它必须是命令的最后一个参数。
4.如何避免覆盖文件
默认情况下,cp命令会替换目标文件,这意味着如果目标中存在同名文件,它将覆盖该文件。但是,我们可以使用该-n
选项禁用此默认行为。
为了理解这一点,让我们尝试覆盖现有文件:
$ cp -n -v file-1.txt file-2.txt
在这个例子中,我们使用该-v
选项来说明file-2.txt文件尚未被覆盖。
5. 如何确认覆盖文件
在上例中,我们了解了如何避免覆盖目标文件。但是,有时我们想以更安全的方式覆盖目标文件。
在这种情况下,我们可以使用-i
该命令的选项使复制操作具有交互性。此选项显示警告消息并等待用户确认后再覆盖文件。
为了说明这一点,让我们尝试覆盖现有文件:
$ cp -i file-1.txt file-2.txt cp: overwrite 'file-2.txt'?
我们可以看到,该命令正在等待确认。就像其他 Linux 命令一样,我们可以使用'y'
继续或'n'
中止操作。
cp命令的默认非交互行为不太安全。用户可能会错误地覆盖重要的配置。因此,一些 Linux 发行版默认使用alias 命令强制执行交互行为:
$ alias cp='cp -i'
6. 仅当源较新时才覆盖文件
在上例中,我们了解了如何使用交互模式。然而,有时用户可能会无意中覆盖较新的文件。
为了避免这种容易出错的情况,我们可以使用该-u
选项,仅当源比目标更新或文件不存在于目标时才尝试复制操作。
首先,更新源文件的时间戳:
$ touch -t 10101010 file-1.txt $ ls -l file-1.txt
在上面的例子中,我们使用了touch 命令-t
的选项将文件的时间戳设置为10-Oct-2010。
接下来,让我们将目标文件的时间戳更新为当前时间:
$ touch file-2.txt
现在,让我们尝试使用以下选项执行复制操作-u
:
$ cp -u -v file-1.txt file-2.txt
在这里,我们可以看到没有尝试复制操作,因为目标文件比源文件更新。
最后,让我们交换源和目标参数并执行复制操作:
$ cp -u -v file-2.txt file-1.txt
在上面的输出中,我们可以观察到复制操作成功,因为源文件比目标文件新。
7. 如何在覆盖之前备份文件
我们可以指示cp命令在覆盖目标文件之前对其进行备份。为此,我们可以使用--backup
执行自动备份的选项。
$ cp --backup=numbered -v file-1.txt file-2.txt
在此示例中,我们使用了编号备份策略。此策略在备份文件名中使用增量数字。
为了理解这一点,让我们多次执行相同的命令并观察输出:
$ cp --backup=numbered -v file-1.txt file-2.txt $ cp --backup=numbered -v file-1.txt file-2.txt $ cp --backup=numbered -v file-1.txt file-2.txt
8.如何强制复制以覆盖文件
在前面的几个例子中,我们了解了如何以更安全的方式覆盖文件。然而,在极少数情况下,需要覆盖文件。然而,并不能保证每次操作都会成功。
例如,如果目标文件没有写权限,复制操作就会失败。我们来举个例子来说明一下。
首先,更改目标文件的权限:
$ chmod 444 file-2.txt $ ls -l file-2.txt
现在,让我们尝试覆盖file-2.txt文件:
$ cp file-1.txt file-2.txt
在上面的输出中,我们可以看到命令因权限被拒绝错误而失败。
为了克服这个限制,我们可以使用该-f
选项,如果目标文件无法打开,则删除目标文件并尝试复制操作。
现在,让我们使用-f
强制覆盖文件的选项:
$ cp -f -v file-1.txt file-2.txt
9. 如何在复制之前删除目标文件
在上例中,我们看到了如果操作过程中出现错误,如何删除目标文件。但有时需要先删除目标文件,然后再执行复制操作。
为了满足这样的要求,我们可以使用该--remove-destination
选项。
$ cp --remove-destination -v file-1.txt file-2.txt
在上面的输出中,我们可以看到 cp 命令首先删除目标文件,然后执行复制操作。
10.如何创建硬链接文件而不是复制
我们可以创建硬链接,而不是创建源文件的新副本。当磁盘空间不足时,此选项起着重要作用。
因此,让我们使用-l
选项来创建硬链接:
$ cp -l -v file-1.txt file-4.txt
现在,让我们检查两个文件的 inode 编号来验证硬链接:
$ ls -i1 file-1.txt file-4.txt
在上面的输出中,第一列中的数字代表 inode 编号。
11.如何创建软链接文件而不是复制
以类似的方式,我们可以创建一个软链接,而不是使用-s
如下所示的选项创建新副本:
$ cp -s -v file-1.txt file-5.txt
现在,让我们验证符号链接是否已正确创建:
$ ls -l file-5.txt
在上面的输出中,最后几列代表符号链接关系。
12.如何在复制时保留文件属性
文件具有多种属性,例如访问时间、修改时间、权限等。默认情况下,复制文件时不会保留这些属性。要覆盖此默认行为,我们可以使用该-p
选项。
为了理解这一点,首先更新file-1.txt的时间戳:
$ touch -t 10101010 file-1.txt
现在,让我们通过保留其所有属性来创建该文件的副本:
$ cp -p -v file-1.txt file-6.txt
最后验证file-6.txt文件的时间戳:
$ ls -l file-6.txt
13. 如何递归执行复制操作
到目前为止,我们了解了如何复制单个文件。然而,很多时候我们必须复制特定目录的所有文件和子目录。
在这种情况下,我们可以使用-r
或-R
选项的递归模式。
因此,让我们创建一个目录并在其下添加一些文件和子目录:
$ mkdir -p dir-1/dir-2 $ touch dir-1/file-1.txt dir-1/dir-2/file-2.txt
接下来,验证目录结构是否已正确创建:
$ tree dir-1
现在,让我们使用以下命令递归复制目录 dir-1:
$ cp -r -v dir-1 dir-3
最后,验证所有文件和子目录是否已成功复制:
$ tree dir-3
14.如何复制多个目录
与文件类似,我们可以使用单个命令递归复制多个目录。但是,要实现这一点,目标目录必须已经存在,并且它必须是命令中的最后一个参数。让我们通过一个例子来理解这一点。
首先,创建一个新目录:
$ mkdir dir-4
现在,让我们使用以下命令将dir-1和dir-3目录复制到dir-4目录中:
$ cp -r -v dir-1 dir-3 dir-4
类似地,我们可以使用-t
命令的选项来实现相同的结果。此选项允许我们指定目标目录。因此我们也可以将其用作第一个参数:
$ cp -t dir-4 -r -v dir-1 dir-3
在本文中,我们讨论了如何使用cp 命令复制文件和目录。初学者可以在日常使用 Linux 系统时参考这些示例。
您知道 Linux 中 cp 命令的其他最佳示例吗?请在下面的评论中告诉我们您的观点。