一份菜单

如何在Linux和Unix中复制文件? 10 cp命令示例

cp是Unix中的基本命令之一。您已经知道它用于将一个或多个文件或目录从源复制到目标。

尽管本教程是针对初学者的,但它对于每个人使用一些实际示例快速回顾各种cp命令选项也很有帮助。

即使您一直在使用cp命令,以下可能还是一个新的示例,对于您来说还是新手。

复制命令的一般形式:

cp [option] source destination

1.将文件或目录从源复制到目标

要复制文件,您需要将源和目标传递给copy命令。以下示例将文件从project / readme.txt复制到projectbackup / readme-new.txt

$ cp  项目/ readme.txt projectbackup/readme-new.txt

$ cd projectbackup/

$ ls
readme-new.txt

如果要将文件从一个文件夹复制到另一个具有相同名称的文件夹,则仅目标目录名称就足够了,如下所示。

$ cp  项目/ readme.txt projectbackup/

$ cd projectbackup/

$ ls
readme.txt

可以使用递归选项-r将目录(及其所有内容)从源复制到目标,如下所示:

$ ls project
src / bin / doc / lib / test / readme.txt许可

$ cp -r项目/备份/

$ ls  后备 
src / bin / doc / lib / test / readme.txt许可

2.复制多个文件或目录

您可以将多个文件从源复制到目标,如下所示:

$ cd src/
$ cp global.c main.c parse.c /home/thegeekstuff/projectbackup/src/

如果源文件具有通用模式,请使用通配符,如下所示。在此示例中,所有c扩展名文件都被复制到/ home / thegeekstuff / projectbackup / src /目录。

$ cp *.c /home/thegeekstuff/projectbackup/src/

复制多个目录,如下所示。

$ cd  项目/ 

$ cp -r src/ bin/ /home/thegeekstuff/projectbackup/

3.复制到目标位置之前先进行备份

如果目标文件已经存在且名称相同,则cp允许您在覆盖目标文件之前先对其进行备份。

在此示例中,readme.txt同时存在于project /和projectbackup /目录中,并且在将其从project /复制到projectbackup /时,将如下所示备份现有的readme.txt:

$ cd projectbackup

$ ls -l readme.txt
-rw-r--r-- 1 bala geek 1038 Jan  8 13:15 readme.txt

$ cd ../project 

$ ls -l readme.txt
-rw-r--r-- 1 bala geek 1020 Jan  8 12:25 readme.txt

$ cp --backup readme.txt  /home/thegeekstuff/projectbackup/

现有文件已移至readme.txt〜,新文件复制为readme.txt,如下所示。

$ cd /home/thegeekstuff/projectbackup/
$ ls -l
-rw-r--r-- 1 bala geek 1020 Jan  8 13:36 readme.txt
-rw-r--r-- 1 bala geek 1038 Jan  8 13:15 readme.txt~

谈到备份,重要的是要您了解如何 rsync命令 有效地备份文件。

4.复制时保留链接

当执行cp命令时,如果源是链接文件,则将复制实际文件,而不是链接文件。如果仅按原样复制链接,请指定选项-d,如下所示:

下面显示了没有选项-d的情况,它将复制文件(而不是链接):

$ cd  项目/ bin

$ ls -l startup.sh
lrwxrwxrwx 1 root root 18 Jan  8 13:59 startup.sh -> ../test/startup.sh

$ cp startup.sh /home/thegeekstuff/projectbackup/bin/

$ cd /home/thegeekstuff/projectbackup/bin/

$ ls -l
-rw-r--r--  1 root root       102 Jan  8 14:02 startup.sh

要在复制时保留链接,请执行以下操作:

$ cd  项目/ bin

$ cp -d startup.sh /home/thegeekstuff/projectbackup/bin/

$ ls -l startup.sh
lrwxrwxrwx 1 root root 18 Jan  8 14:10 startup.sh -> ../test/startup.sh

5.唐’t覆盖现有文件

如果仅在目标文件不存在时复制’如果存在,请使用选项-n,如下所示。这个赢了’t覆盖现有文件,cp命令将返回成功退出代码,如下所示:

$ cd projectbackup

$ ls -l readme.txt
-rw-r--r-- 1 bala geek 1038 Jan  8 13:15 readme.txt

$ cd ../project 

$ ls -l readme.txt
-rw-r--r-- 1 bala geek 1020 Jan  8 12:25 readme.txt

$ cp -n readme.txt /home/thegeekstuff/projectbackup/bin/

$ echo $?
0

如下所示,目标文件没有’t get overwritten.

$ cd projectbackup

$ ls -l readme.txt
-rw-r--r-- 1 bala geek 1038 Jan  8 13:15 readme.txt

6.覆盖前确认(交互模式)

当使用-i选项时,它将在覆盖文件之前要求确认,如下所示。

$ cp -i readme.txt /home/thegeekstuff/projectbackup/
cp: overwrite `/home/thegeekstuff/projectbackup/readme.txt'? y

7.创建指向文件的硬链接(而不是复制)

执行cp命令时,可以创建文件的硬链接(而不是复制文件)。以下示例将sample.txt文件的硬链接创建到目录test /中,

$ ls -li sample.txt
10883362 -rw-r--r-- 2 bala geek   1038 Jan  9 18:40 sample.txt

$ cp -l sample.txt test/ 

$ ls -li test/sample.txt
10883362 -rw-r--r-- 2 bala geek   1038 Jan  9 18:40 test/sample.txt

如上所示,test / sample.txt是到sample.txt文件的硬链接文件,并且两个文件的inode相同。

8.创建指向文件或目录的软链接(而不是复制)

执行cp命令时,可以创建到文件或目录的软链接。在以下示例中,为libFS.so.6.0.0创建的符号链接为libFS.so,

# cd /usr/lib/

# ls -l libFS.so.6.0.0
-rw-r--r-- 1 root root 42808 Nov 19  2010 libFS.so.6.0.0

# cp -s libFS.so.6.0.0 libFS.so

# ls -l libFS.so
lrwxrwxrwx 1 root root 14 Jan  9 20:18 libFS.so -> libFS.so.6.0.0

9.复制时保留文件或目录的属性

使用-p选项,可以保留文件或目录的属性,如下所示:

$ ls -l sample.txt
-rw-r--r-- 2 bala geek   1038 Jan  9 18:40 sample.txt

$ cp -p sample.txt test/ 

$ ls -l test/sample.txt
-rw-r--r-- 2 bala geek   1038 Jan  9 18:40 test/sample.txt

也可以仅保留所需的属性,例如模式,所有权,时间戳等,

以下示例在复制文件时保留其模式:

$ cp --preserve=mode sample.txt test/

10.仅在源文件比目标文件新或丢失时复制

复制不’一个小文件花费很多时间,但是复制一个大文件可能要花费大量时间。因此,在复制大文件时,您可能需要确保仅当源文件比目标文件新时,或者当使用-u选项丢失目标文件时,才进行操作,如下所示。

在此示例中,两个文件LICENSE和readme.txt将被从project /复制到projectbackup /。但是,LICENSE文件已经存在于projectbackup /目录中,并且比project /目录中的文件更新。

$ cd  项目/ 

$ ls -l LICENSE readme.txt 
-rw-r--r-- 1 bala geek 108 Jan  8 13:14 LICENSE
-rw-r--r-- 1 bala geek 32 Jan  8 13:16 readme.txt

$ cd /home/thegeekstuff/projectbackup/

$ ls -l LICENSE readme.txt 
ls: cannot access readme.txt: No such file or directory
-rw-r--r-- 1 root root 112 Jan  9 20:31 LICENSE

因此,在此示例中,无需将LICENSE文件再次复制到projectbackup /目录。如果您使用-u选项,则cp命令会自动注意这一点,如下所示。在以下示例中,仅复制了readme.txt文件,如该文件上的时间戳所示。

$ cp -u -v LICENSE readme.txt  /home/thegeekstuff/projectbackup/
`readme.txt' -> `/home/thegeekstuff/projectbackup/readme.txt'

$ cd /home/thegeekstuff/projectbackup/

$ ls -l LICENSE readme.txt 
-rw-r--r-- 1 bala geek  112 Jan  9 20:31 LICENSE
-rw-r--r-- 1 bala geek   32 Jan  9 22:17 readme.txt

如果您喜欢这篇文章,您可能还会喜欢..

  1. 50个Linux Sysadmin教程
  2. 50个最常用的Linux命令(包括示例)
  3. 排名前25位的最佳Linux性能监视和调试工具
  4. 妈妈,我找到了! 15个实用的Linux Find命令示例
  5. Linux 101 Hacks第二版电子书 Linux 101黑客手册

Bash 101 Hacks书 Sed和Awk 101黑客手册 Nagios Core 3书 Vim 101黑客手册

{ 39 评论 … 加一 }

  • 张han 2013年3月6日,上午8:39

    非常清楚,对这些联络员很有启发。

  • 贾拉尔·哈吉霍拉玛利 2013年3月6日,上午9:58

    你好
    很简单很漂亮
    谢谢

  • 奥列克桑德尔 2013年3月6日,上午10:33

    2.将多个文件或目录复制到其他位置
    我想应该是”从不同位置复制多个文件或目录” 😉

    并感谢您的文章–总是足够清晰和全面!

  • 罗迪卡胆 2013年3月6日,上午10:48

    我认为此链接是一种快速有效的方法,可用于调出您曾经知道的某些命令并刷新它们

  • 杰森 2013年3月6日,上午10:54

    非常好—我从不知道cp可以创建链接。这很容易知道!

  • 丹妮 2013年3月6日,上午10:55

    解释的好方法

  • 克里斯·约翰逊 2013年3月6日,下午12:48

    一些示例在Linux *和* Unix上不起作用。

    使用GNU long选项的示例(例如–保留=模式)在标准Unix版本的cp中不起作用。

    -r,-s,-u,-v或-l选项也没有。

  • 罗杰 2013年3月6日,下午1:55

    您可能要检查第10项,您可能在其中键入了错误。我认为,正如手册页所确认的那样,当SOURCE文件比DESTINATION更新时,将执行复制。否则,我发现它是不错的复习。

  • 道格 2013年3月6日,下午2:50

    嘿!,命令提示符世界的新手。哇!
    我在哪里可以获得newbs新手newb教程?因为对于我来说,在这一点上,我发现很难知道GUI中的去向和作用。我知道,这是一件可怕的事情,但这就是我在哪里,并试图尽快吸收它!顺便说一句,我已经能够将linux mint放在较旧的craptop上,它现在很好,而且薄荷新鲜!
    tnx。

  • iAmAbEgInNer 2013年3月6日,下午3:31

    感谢您一定会派上用场的文章。

  • 克里斯·约翰逊 2013年3月6日,晚上9:14

    道格(Doug),我的网站上有一个指向外壳资源的链接页面: 这里 .

    cp命令的POSIX规范是 这里

  • 贾利勒 2013年3月6日,晚上10:46

    你好
    优秀和…. 谢谢
    扎尔

  • 拉梅什·纳塔拉詹(Ramesh Natarajan) 2013年3月6日,下午11:51

    @ 奥列克桑德尔 ,@ 罗杰 ,

    感谢您指出问题。现在已修复。

  • 彼得 2013年3月7日,上午1:19

    像往常一样很棒的例子ðŸ™,谢谢!

    在项目1:您不复制目录,而仅复制目录的内容。

    我知道不同的发行版具有不同的行为,因此可能并非总是如此。复制目录及其内容时,您不应该’t使用斜杠(/)。使用斜杠时,’s您要复制的目录的内容。

    复制目录的内容:
    $ cp -r项目/备份/
    $ ls 后备 /
    src / bin / doc / lib / test / readme.txt许可

    复制目录及其内容:
    $ cp -r项目备份/
    $ ls 后备 /
    项目/
    $树备份
    后备
    “€â€â€项目
    “—许可
    “—垃圾箱
    “docdoc
    “readme.txt
    “— src
    â€â€â€测试

  • 库马尔 2013年3月7日,上午3:13

    大!! cp命令’精湛的技巧在精通的说明中得到了解释,值得一试。

  • 后满man 2013年3月7日,上午4:11

    非常有用..谢谢

  • 道格 2013年3月7日,上午4:45

    克里斯,
    谢谢,我会检查他们两个。

  • 德维 2013年3月7日,上午5:40

    好例子…将是一个快速修订

  • 穆罕默德·阿尔·杰伊德 2013年3月7日,上午10:14

    非常好

    Tnx。

  • 迪姆 2013年3月8日,下午12:43

    好消息提醒您最好阅读此类常用命令的手册页。您’有用的选项会让我感到惊讶。

    其他一些命令命令大多数用户(和管理员)经常使用,但只能利用一,二,三,… options are:
    “ps”(Linux同时支持Berkley(BSD)和AT&T System V选项很好)
    “ls” ( -h, –hide/–忽略-m,-Q,-S,-X,-1)
    “grep”(-r,-o -A,-B; -G(BRE),-E(ERE),-P(PerlRegex),-m,-x…)
    “sed”(喜欢-i选项,没有更多的重定向和移动。)
    “find”(-iname,-iregex,-delete,-print0和-fprint0 -ok)
    并不断

  • 巴维亚 2013年3月10日,上午2:20

    很好的例子………..我想要c指针。

  • 法鲁克 2013年3月14日,上午12:44

    感谢您的帖子。但是当我以普通用户身份使用-p选项复制文件时,它不会’保留所有者属性,同时保留它们,将其复制为root。任何的想法?提前致谢…

  • 克里斯·约翰逊 2013年3月14日,晚上10:39

    é–mer,您正在制作副本,因此您是其所有者。

  • 法鲁克 2013年3月15日,上午1:56

    克里斯,在人中说:“-p same as –保留=模式,所有权,时间戳”,所以我了解到,当我对其他用户拥有的文件使用-p选项时,它应该保留所有者的标题。对?

  • 克里斯·约翰逊 2013年3月15日,上午2:32

    复制文件时*您正在执行该操作。

    *您*阅读了要复制的文件。

    *您*将文件保存到新位置,因此*您*是文件的所有者。

    *您*无权更改该文件的所有权,只有root可以这样做。

    因此,原始文件的所有权无法保留。

  • 大卫 2013年3月15日,上午10:58

    嘿,谢谢你的教程。我大量使用复制。但是,我通常希望在将其与其他命令配合使用时应用copy命令。例如,我只想搜索文本文件,然后将它们cp到某个文件夹,例如

    ls / home / david / Documents / | grep“txt”| cp / home / david / text_files

    我该怎么做?非常感谢…

  • 克里斯·约翰逊 2013年3月15日,下午12:31

    大卫 ,cp不会读取其stdin,而ls和grep是不必要的:

    cp / home / david / Documents / * txt * / home / david / text_files

  • 杰森 2013年3月15日,下午1:31

    我实际上使用了该站点,并使用了另一个参考来使用“find”命令执行您想要的操作。

    例:
    cd / dir / with / text / files
    找 . -name “*txt*”-exec cp {} / home / david / txt_files \;

    那应该为您解决问题。

  • 杰森 2013年3月15日,下午1:32

    注意:以上将递归工作。

  • 普拉纳夫 2013年3月21日,晚上10:08

    不错的文章,非常有用,非常感谢

  • 比拉勒·阿里(Bilal Ali) 2013年3月22日,下午3:17

    是否有任何选项可以在控制台上显示进度和复制的文件。

  • 大卫 2013年3月23日,上午4:58

    感谢Jason的回复。

    Bilal ALi,您可以将rsync与“show progress” option like
    rsync -P

  • Charandeep 2013年4月15日,上午3:29

    你好

    有什么命令可以检查复制了多少?
    即id我们必须将一个1gb的文件夹从一个位置复制到另一个位置,是否有任何命令显示该文件夹已被复制的百分比。

    谢谢,
    Charandeep

  • 潘卡 2013年7月1日,上午4:11

    嗨,
    当我们通过ln -s命令创建软链接时,我们也可以在整个目录中创建,但是在同一情况下,当我们尝试通过cp -s在整个目录中创建软链接时,也会出现错误…你能解释一下吗…这里通过cp命令完全反对ln命令

  • 克里斯·约翰逊 2013年7月2日,上午2:06

    Charandeep ,看看–rsync的进度选项。

  • 匿名 2013年9月3日,上午4:41

    查找多个不同类型的文件,例如mp4,txt,avi,c,cpp等,然后将它们复制到一个位置。

    因为我找到了。 -name file1.txt -o -name file2.avi -o -name -o -name file3.c -o -name file4.cpp`;做cp $ i;完成

  • 克里斯·约翰逊 2013年9月5日,晚上9:54

    匿名,那个’一个很好的例子说明如何不处理文件(您是否一直在阅读Advanced Bash脚本指南?它有如此糟糕的例子)。

    如果任何文件包含空格或外壳程序专用的任何其他字符,则将失败。

  • 牛津大学 2014年11月24日,晚上11:46

    如果我有100个文件要从一个目录复制到另一个目录(不包括一个特定目录)。
    我们可以在cp命令中排除该文件吗?

  • 戈文德 2017年3月17日,上午11:51

    如何将多个文件复制到同一主目录中的多个目录中?用一个命令。

发表评论