linux cp命令代码,Linux cp命令(示例代码)

Linux系统中cp(copy)命令是用来复制文件或者目录的。

man cp可以获得cp的详细描述

命令格式:

cp [OPTION]... [-T] SOURCE DEST      //cp [选项]…[-T]源目的

cp [OPTION]... SOURCE... DIRECTORY   // cp [选项]…源…目录

cp [OPTION]... -t DIRECTORY SOURCE...  // cp [选项]…-t 目录 源…

功能:

Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

//将源文件复制至目标文件,或将多个源文件复制至目标目录。

参数:

-a     该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。

-d     拷贝时保留链接:若源文件为连接文件的属性(linkfile),则复制连接文件属性而非文件本身

-f      强制的意思,删除已经存在的目标文件而不提示。 (慎用)

-i      和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。(最常用)

-p      此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。(备份常用)

-r      递归持续复制,用于目录的复制行为:若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。

-l      不作拷贝,只是链接文件,而非复制文件本身。

-s    复制成符号链接文件(symbolic link),即“快捷方式”文件

-u     若目标比来源文件旧时,才更新,常用于“备份”工作

命令示列:

1.-i参数示例[[email protected] ~]# cp ~/.bashrc /tmp/bashrc         复制和更名操作

[[email protected] ~]# cp -i ~/.bashrc /tmp/bashrc      由于已经复制,加入-i参数后,覆盖前会做提示

cp: overwrite `/tmp/bashrc‘? y                 按y表示确认

5693ef20cf939a36602cf7cab63abf32.png

2.-a参数示例[[email protected] ~]# cd /tmp                          进入/tmp目录

[[email protected] tmp]# cp /var/log/wtmp .             要想复制到当前目录,最后要加"."

[[email protected] tmp]# ls -l /var/log/wtmp wtmp

-rw-rw-r--. 1 root utmp 24960 Apr  6 14:06 /var/log/wtmp

-rw-r--r--  1 root root 24960 Apr  6 14:39 wtmp

3e3a4978a759fa2ff42efd5e5ecdd42f.png

在不加任何参数的情况下,某些属性/权限会改变

文件的创建时间也不同了

如果要将文件的所有特性都一起复制过来,可以加上-a,如下所示[[email protected] tmp]# cp -a /var/log/wtmp wtmp3

[[email protected] tmp]# ls -l /var/log/wtmp wtmp3

-rw-rw-r--. 1 root utmp 24960 Apr  6 14:06 /var/log/wtmp

-rw-rw-r--. 1 root utmp 24960 Apr  6 14:06 wtmp3

65db4d68c52fb9cd3fbdec46583c983f.png

整个数据特性完全一样,这就是-a的特性

由于具有这个特性,因此当我们在进行备份的时候,某些需要特别注意的特殊权限文件, 例如密码档 (/etc/shadow) 以及一些配置档,就不能直接以 cp

来复制,而必须要加上 -a 或者是 -p 等等可以完整复制文件权限的选项才行!另外,如果你想要复制文件给其他的使用者,

也必须要注意到文件的权限(包含读、写、运行以及文件拥有者等等), 否则,其他人还是无法针对你给予的文件进行修订的动作喔!注意注意!

3.-r示例,将目录下的所有目录包括子目录陆续复制到另外一个目录[[email protected] tmp]# cp /etc/ /tmp

cp: omitting directory `/etc/‘             如果是目录,不能直接复制

[[email protected] tmp]# cp -r /etc/ /tmp           要加入-r才能复制目录

[[email protected] tmp]#

549b79057e82a071b6eb47849ec1f934.png

4.-s,-l示例[[email protected] tmp]# ls -l bashrc

-rw-r--r-- 1 root root 206 Apr  6 14:24 bashrc

[[email protected] tmp]# cp -s bashrc bashrc_slink         创建软链接,就是一个快捷方式

[[email protected] tmp]# cp -l bashrc bashrc_hlink         创建硬链接

[[email protected] tmp]# ls -l bashrc*

-rw-r--r-- 2 root root 206 Apr  6 14:24 bashrc                   源文件i-node,是2

-rw-r--r-- 2 root root 206 Apr  6 14:24 bashrc_hlink             硬链接i-node,是2

lrwxrwxrwx 1 root root   6 Apr 6 15:07 bashrc_slink -> bashrc    软链接i-node,还是1

8753b2baab66fca0263fcd521c4d4f0c.png

5.-u示例,若~./bashrc比/tmp/bashrc新才复制过来[[email protected] tmp]# cp -u ~/.bashrc /tmp/bashrc       常用于备份工作

6.-d示例,将bashrc_slink复制成为bashrc_slink_1与bashrc_slink_2[[email protected] tmp]# cp bashrc_slink bashrc_slink_1

[[email protected] tmp]# cp -d bashrc_slink bashrc_slink_2

[[email protected] tmp]# ls -l bashrc bashrc_slink*

-rw-r--r-- 2 root root 206 Apr  6 14:24 bashrc

lrwxrwxrwx 1 root root   6 Apr  6 15:22 bashrc_slink -> bashrc

-rw-r--r-- 1 root root 206 Apr  6 15:22 bashrc_slink_1              与源文件相同

lrwxrwxrwx 1 root root   6 Apr  6 15:22 bashrc_slink_2 -> bashrc    是连接文件

7adcbe54704442db7ddf97c699710a20.png

这个例子也是很有趣喔!原本复制的是连结档,但是却将连结档的实际文件复制过来了

也就是说,如果没有加上任何选项时,cp复制的是原始文件,而非连结档的属性!

若要复制连结档的属性,就得要使用 -d 的选项了!如 bashrc_slink_2 所示。

7.使用zdw用户,完整复制[[email protected] ~]$ cp -a /var/log/wtmp /tmp/zdw_wtmp

[[email protected] ~]$ ls -l /var/log/wtmp /tmp/zdw_wtmp

-rw-rw-r--  1 zdw  zdw  24960 Apr  6 14:06 /tmp/zdw_wtmp

-rw-rw-r--. 1 root utmp 24960 Apr  6 14:06 /var/log/wtmp

a696ffdd7cb3b97e5684031edb9e5a65.png

由于zdw的身份并不能随意修改文件的拥有者与群组,因此虽然能够复制wtmp的相关权限与时间等属性,但是与拥有者、群组相关的,原本zdw身份无法进行的动作,即使加上

-a 选项,也是无法达成完整复制权限的!

8.把多个数据一次复制到指定目录下[[email protected] tmp]# cp ~/.bashrc ~/.bash_history /tmp    可以填写多个数据,复制到一个目录下

以上操作,完全参照鸟哥的私房菜一书

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C语言实现Linux cp命令示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #define BUF_SIZE 1024 int main(int argc, char *argv[]) { int srcFd, destFd, numRead, numWrite; char buffer[BUF_SIZE]; struct stat fileStat; if (argc != 3) { fprintf(stderr, "Usage: %s <source_file> <destination_file>\n", argv[0]); exit(EXIT_FAILURE); } if ((srcFd = open(argv[1], O_RDONLY)) == -1) { perror("open"); exit(EXIT_FAILURE); } if (fstat(srcFd, &fileStat) == -1) { perror("fstat"); exit(EXIT_FAILURE); } if ((destFd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, fileStat.st_mode)) == -1) { perror("open"); exit(EXIT_FAILURE); } while ((numRead = read(srcFd, buffer, BUF_SIZE)) > 0) { if ((numWrite = write(destFd, buffer, numRead)) != numRead) { fprintf(stderr, "Error writing to destination file\n"); exit(EXIT_FAILURE); } } if (numRead == -1) { perror("read"); exit(EXIT_FAILURE); } if (close(srcFd) == -1) { perror("close"); exit(EXIT_FAILURE); } if (close(destFd) == -1) { perror("close"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } ``` 该程序使用了Linux系统调用中的open、read、write、fstat和close函数,实现了从源文件复制到目标文件的功能。其中,BUF_SIZE定义了缓冲区的大小。程序使用命令行参数传入源文件和目标文件的路径。在程序中,首先打开源文件并获取其状态信息,然后创建目标文件并设置其权限为源文件的权限,最后使用循环从源文件读取数据并写入到目标文件中。如果读取或写入时出现错误,则输出错误信息并退出程序。最后关闭源文件和目标文件。 需要注意的是,该程序只是一个示例,可能并不完全符合Linux cp命令的实现方式。例如,在Linux cp命令中,如果目标文件已经存在,则会提示用户是否覆盖目标文件。在此示例程序中,如果目标文件已经存在,将会被覆盖。因此,在实际使用中,需要根据需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值