📜  Linux 中的 cp 命令及示例

📅  最后修改于: 2022-05-13 01:57:30.580000             🧑  作者: Mango

Linux 中的 cp 命令及示例

cp代表复制。此命令用于复制文件或文件组或目录。它在具有不同文件名的磁盘上创建文件的精确图像。 cp命令的参数中至少需要两个文件名。

句法:

cp [OPTION] Source Destination
cp [OPTION] Source Directory
cp [OPTION] Source-1 Source-2 Source-3 Source-n Directory

First and second syntax is used to copy Source file to Destination file or Directory.
Third syntax is used to copy multiple Sources(files) to Directory.

cp命令适用于三种主要操作模式,这些操作取决于 cp 命令中传递的参数的数量和类型:

  1. 两个文件名:如果命令包含两个文件名,则将第一个文件的内容复制到第二个文件。如果第二个文件不存在,则首先创建一个并将内容复制到其中。但是,如果它存在,那么它会在没有任何警告的情况下被简单地覆盖。所以在选择目标文件名时要小心。
    cp Src_file Dest_file
    

    假设有一个名为geeksforgeeks的目录,有一个文本文件a.txt
    例子:

    $ ls
    a.txt
    
    $ cp a.txt b.txt
    
    $ ls
    a.txt  b.txt
    
  2. 一个或多个参数:如果该命令有一个或多个参数,指定文件名并在这些参数之后,一个指定目录名的参数,则此命令将每个源文件复制到具有相同名称的目标目录,如果不存在则创建存在然后它会被覆盖,所以要小心!!
    cp Src_file1 Src_file2 Src_file3 Dest_directory
    

    假设有一个名为geeksforgeeks的目录,其中包含一个文本文件a.txt、b.txt和一个目录名称new ,我们将在其中复制所有文件。
    例子:



    $ ls
    a.txt  b.txt  new
    
    Initially new is empty
    $ ls new
    
    $ cp a.txt b.txt new
    
    $ ls new
    a.txt  b.txt
    

    注意:对于这种情况,最后一个参数必须目录名称。要使上述命令起作用, Dest_directory必须存在,因为cp命令不会创建它。

  3. 两个目录名:如果命令包含两个目录名, cp将源目录的所有文件复制到目标目录,创建所需的任何文件或目录。这种操作模式需要一个额外的选项,通常是R ,以指示目录的递归复制。
    cp -R Src_directory Dest_directory
    

    在上面的命令中, cp行为取决于Dest_directory是否存在。如果Dest_directory不存在,cp 创建它并按原样递归复制 Src_directory 的内容。但如果 Dest_directory 存在,则 Src_directory 的副本成为Dest_directory下的子目录

选项:

cp命令有很多选项,这里我们将讨论一些有用的选项:
假设名为geeksforgeeks的目录包含两个文件,其中的一些内容名为a.txtb.txt 。此方案有助于理解以下选项。

$ ls geeksforgeeks
a.txt  b.txt

$ cat a.txt
GFG

$ cat b.txt
GeeksforGeeks

1. -i(interactive): i代表交互式复制。使用此选项系统在覆盖目标文件之前首先警告用户。 cp提示您做出响应,如果您按y则它会覆盖该文件,并使用任何其他选项将其保留为未复制。

$ cp -i a.txt b.txt
cp: overwrite 'b.txt'? y

$ cat b.txt
GFG

2. -b(backup):使用这个选项, cp命令在同一个文件夹中以不同的名称和不同的格式创建目标文件的备份。

$ ls
a.txt  b.txt

$ cp -b a.txt b.txt

$ ls
a.txt  b.txt  b.txt~

3. -f(force):如果系统因为用户对这个文件没有写权限而无法打开目标文件进行写操作,那么在cp命令中使用-f选项,先删除目标文件,然后再复制内容是从源文件到目标文件完成的。

$ ls -l b.txt
-r-xr-xr-x+ 1 User User 3 Nov 24 08:45 b.txt

User, group and others doesn't have writing permission.

Without -f option, command not executed
$ cp a.txt b.txt
cp: cannot create regular file 'b.txt': Permission denied

With -f option, command executed successfully
$ cp -f a.txt b.txt

4. -r 或 -R:复制目录结构。使用此选项, cp命令通过递归复制整个目录结构来显示其递归行为。
假设我们要将包含许多文件的geeksforgeeks目录复制到 gfg目录中(不存在)。

$ ls geeksforgeeks/
a.txt  b.txt  b.txt~  Folder1  Folder2

Without -r option, error
$ cp geeksforgeeks gfg
cp: -r not specified; omitting directory 'geeksforgeeks'

With -r, execute successfully
$ cp -r geeksforgeeks gfg

$ ls gfg/
a.txt  b.txt  b.txt~  Folder1  Folder2

5. -p(preserve):-p选项cp在对应的目标文件中保留每个源文件的以下特征:上次修改数据的时间和上次访问的时间,所有权(仅当有权限时)这样做),以及文件权限位。
注意:为了保存特性,您必须是系统的root用户,否则特性会发生变化。

$ ls -l a.txt
-rwxr-xr-x+ 1 User User 3 Nov 24 08:13 a.txt

$ cp -p a.txt c.txt

$ ls -l c.txt
-rwxr-xr-x+ 1 User User 3 Nov 24 08:13 c.txt

正如我们在上面看到的, a.txtc.txt (通过复制创建)具有相同的特征。

例子:

使用 * 通配符复制:星号通配符代表任何内容,即所有文件和目录。假设我们在一个目录中有很多文本文档,并且想要将其复制到另一个目录中,如果我们将文件1个一个复制或命令变得太长,如果将所有这些文件名作为参数,则需要大量时间,但是通过使用*通配符它变得简单。

Initially Folder1 is empty
$ ls
a.txt  b.txt  c.txt  d.txt  e.txt  Folder1

$ cp *.txt Folder1

$ ls Folder1
a.txt  b.txt  c.txt  d.txt  e.txt


参考:
维基百科