Linux cp命令怎么使用?

Linux cp命令怎么使用?,第1张

该命令的功能是将给出的文件目录拷贝到另一文件或目录中,同MSDOS下的copy命令一样,功能十分强大。

语法: cp [选项] 源文件或目录 目标文件或目录

说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。

该命令的各选项含义如下:

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

- d 拷贝时保留链接。

- f 删除已经存在的目标文件而不提示。

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

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

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

- l 不作拷贝,只是链接文件。

需要说明的是,为防止用户在不经意的情况下用cp命令破坏另一个文件,如用户指定的目标文件名已存在,用cp命令拷贝文件后,这个文件就会被新源文件覆盖,因此,建议用户在使用cp命令拷贝文件时,最好使用i选项。

例子:

Cp -i file1 file2               (将文档 file1 复制成 file2 . _i为提示确认。)

cp file1 dir1               将文档 file1 复制到目录 dir1 下,文件名仍为 file1.

cp /tmp/file1 .               将目录 /tmp 下的文档 file1复制到现行目录下,档名仍为 file1.

cp /tmp/file1 file2               将目录 /tmp 下的文档 file1现行目录下,档名为file2

cp -r dir1 dir2               (recursive copy) 复制整个目录.若目录 dir2 不存在,则将目录dir1,及其所有文档和子目录,复制到目录 dir2 下,新目录名称为dir1.若目录dir2不存在,则将dir1,及其所有文档和子目录,复制为目录 dir2.

CP,Content Provider,即内容提供商, 指依法或依约定拥有版权和/或邻接权以及与版权作品有关的其他权利的,以及依法或依约定有权代表版权人和/或邻接权人进行许可授权、收取版权使用费用的公司实体或机构。

CP,同样也是COUPLE的缩写,即配对,主要用在同人作品中.

比如,在火影忍者耽美同人里说CP是鼬卡或鼬X卡卡西,就是以宇智波鼬和旗木卡卡西为配对进行创作.

在化学领域,CP是指化学纯,标签为中蓝,用于一般化学试验。

CP,C代表电荷共轭的变换,是粒子和反粒子互相对称,即对于粒子和反粒子;P代表宇称变换,是空间反射对称,即同一种粒子之间互为镜像。

在Linux系统里面用到 cp命令复制不能显示文件拷贝的进度,也不能计算还有多长时间文件可以 拷贝结束,现在写一个程序可以显示文件拷贝的进度。

思路:当前目录下面有一个1G大小的bigfile文件

当我在命令行下面输入ls -lh bigfile,我会得到这个文件的详细信息,当然也可以看到文件的大小。

www.linuxidc.com@linuxidc~$ ls -lh bigfile

-rw-rw-r-- 1 nii nii 1000M 7月 13 19:41 bigfile

我们可以用popen函数,把执行之后的结果”-rw-rw-r– 1 nii nii 1000M 7月 13 19:41 bigfil”这串字符串接收下来,我们可以提取出来表示文件大小的那段字符串,比如这个我们可以提取”1000”在用atoi函数,把字符串转换为int型数值1000(不了解popen函数和atoi函数的请自行学习),就可以获得文件大小。

例如我的文件名字叫mycp.c,我执行gcc -o mycp mycp.c生成一个mycp的可执行文件。

接下来我在命令行上输入./mycp bigfile destbigfile把当前目录下面的bigfile文件拷贝为destbigfile,这时我产生一个子进程,子进程负责调用系统的cp命令拷贝,父进程每隔一秒钟,去获取destbigfile、bigfile 文件的大小,就可以知道拷贝的进度,当然也可以获得拷贝的时间,就可以计算出来离拷贝结束还有多长时间。

下面是代码的实现:

#include

#include

#include

#include

#include

#include

#include

/** 得到文件的详细信息 */

int getFileMsg(char* pchCmd,char *pchMsg)

int main(int argc,char* argv[])

{

char szSrcFileMsg[150] = {0}

char szSrcFileSizeMsg[10] = {0}

int nSrcFileSize = 0

char szSDestFileMsg[150] = {0}

char szDestFileSizeMsg[10] = {0}

int nDestFileSize = 0

int pid = 0

/** shell执行的命令 ,在创建文件的时候使用*/

char szExcueCommand[150] = {0}

float fRate = 0

int nUsedTime = 0

float nLastTime = 0

/** 入参必须是三个 */

if (1 == argc)

{

printf("please input the src and des file\n")

return -1

}

/** 产生子进程 */

pid = fork()

/** 如果是子进程,负责执行复制命令 */

if (0 == pid)

{

sprintf(szExcueCommand,"%s %s %s","cp",argv[1],argv[2])

printf("%s\n",szExcueCommand)

system(szExcueCommand)

return 0

}

/** 父进程负责把正在复制的原文件和复制的目标文件的大小计算出来,就可以知道复制的进度,计算频率为1秒一次 */

else

{

/** 获得原文件的大小 */

if (-1 == getFileMsg(argv[1],szSrcFileMsg))

{

printf("get sorce file message failed \n")

return -1

}

/** 把原文件大小的信息取出来 */

strncpy(szSrcFileSizeMsg,szSrcFileMsg+21,4)

szSrcFileSizeMsg[5] = '\0'

nSrcFileSize = atoi(szSrcFileSizeMsg)

while(1)

{

sleep(1)

nUsedTime ++

/** 获得目标文件的大小 */

if (-1 == getFileMsg(argv[2],szSDestFileMsg))

{

printf("get dest file message failed \n")

return -1

}

/** 把原文件大小的信息取出来 */

strncpy(szDestFileSizeMsg,szSDestFileMsg+21,4)

szDestFileSizeMsg[5] = '\0'

nDestFileSize = atoi(szDestFileSizeMsg)

/*** 计算复制的进度 */

fRate = (nDestFileSize * 100) / nSrcFileSize

/** 计算剩下的时间 */

nLastTime = ((100 - fRate) * nUsedTime) / fRate

/** 打印进度条 */

printf("已复制 %.2f %% 还需要 %.1f 秒\n",fRate,nLastTime)

/** 复制完成之后,退出循环 */

if (nSrcFileSize == nDestFileSize)

{

printf("复制完成,耗时 %d 秒\n",nUsedTime)

break

}

}

}

return 0

}

/** 得到文件的详细信息 */

int getFileMsg(char* pchCmd,char *pchMsg)

{

FILE *fstream=NULL

char szBuff[BUFSIZ] = {0}

char szExcueCommand[150] = {"ls -lh"}

sprintf(szExcueCommand,"%s %s",szExcueCommand,pchCmd)

if (NULL==(fstream=popen(szExcueCommand,"r")))

{

perror("execute command failed: ")

return -1

}

/** 得到命令的结果 */

if (NULL == fgets(szBuff, sizeof(szBuff), fstream))

{

pclose(fstream)

return -1

}

pclose(fstream)

strcpy(pchMsg,szBuff)

return 0

}

Linux下执行结果为:

www.linuxidc.com@linuxidc:~/advance_code/homework/signal$ ./mycp bigfile destbigfile

cp bigfile destbigfile

已复制 3.00 % 还需要 32.3 秒

已复制 5.00 % 还需要 38.0 秒

已复制 8.00 % 还需要 34.5 秒

已复制 10.00 % 还需要 36.0 秒

已复制 12.00 % 还需要 36.7 秒

已复制 13.00 % 还需要 40.2 秒

已复制 14.00 % 还需要 43.0 秒

已复制 17.00 % 还需要 39.1 秒

已复制 20.00 % 还需要 36.0 秒

已复制 21.00 % 还需要 37.6 秒

已复制 24.00 % 还需要 34.8 秒

已复制 24.00 % 还需要 38.0 秒

已复制 27.00 % 还需要 35.1 秒

已复制 32.00 % 还需要 29.8 秒

已复制 33.00 % 还需要 30.5 秒

已复制 35.00 % 还需要 29.7 秒

已复制 38.00 % 还需要 27.7 秒

已复制 41.00 % 还需要 25.9 秒

已复制 42.00 % 还需要 26.2 秒

已复制 43.00 % 还需要 26.5 秒

已复制 44.00 % 还需要 26.7 秒

已复制 48.00 % 还需要 23.8 秒

已复制 50.00 % 还需要 23.0 秒

已复制 52.00 % 还需要 22.2 秒

已复制 53.00 % 还需要 22.2 秒

已复制 53.00 % 还需要 23.1 秒

已复制 57.00 % 还需要 20.4 秒

已复制 59.00 % 还需要 19.5 秒

已复制 61.00 % 还需要 18.5 秒

已复制 63.00 % 还需要 17.6 秒

已复制 63.00 % 还需要 18.2 秒

已复制 66.00 % 还需要 16.5 秒

已复制 69.00 % 还需要 14.8 秒

已复制 70.00 % 还需要 14.6 秒

已复制 72.00 % 还需要 13.6 秒

已复制 73.00 % 还需要 13.3 秒

已复制 75.00 % 还需要 12.3 秒

已复制 78.00 % 还需要 10.7 秒

已复制 79.00 % 还需要 10.4 秒

已复制 82.00 % 还需要 8.8 秒

已复制 83.00 % 还需要 8.4 秒

已复制 84.00 % 还需要 8.0 秒

已复制 87.00 % 还需要 6.4 秒

已复制 90.00 % 还需要 4.9 秒

已复制 91.00 % 还需要 4.5 秒

已复制 93.00 % 还需要 3.5 秒

已复制 93.00 % 还需要 3.5 秒

已复制 96.00 % 还需要 2.0 秒

已复制 99.00 % 还需要 0.5 秒

已复制 100.00 % 还需要 0.0 秒

复制完成,耗时 50 秒

1、使用cp命令的-n参数即可跳过相同的文件 。2、cp命令使用详解:1)、用法:cp [选项]... [-T] 源文件 目标文件或:cp [选项]... 源文件... 目录或:cp [选项]... -t 目录 源文件...将源文件复制至目标文件,或将多个源文件复制至目标目录。2)、长选项必须使用的参数对于短选项时也是必需使用的。-a, --archive 等于-dR --preserve=all--backup[=CONTROL 为每个已存在的目标文件创建备份-b类似--backup 但不接受参数--copy-contents 在递归处理是复制特殊文件内容-d等于--no-dereference --preserve=links-f, --force 如果目标文件无法打开则将其移除并重试(当 -n 选项存在时则不需再选此项)-i, --interactive 覆盖前询问(使前面的 -n 选项失效)-H跟随源文件中的命令行符号链接-l, --link 链接文件而不复制-L, --dereference 总是跟随符号链接-n, --no-clobber 不要覆盖已存在的文件(使前面的 -i 选项失效)-P, --no-dereference 不跟随源文件中的符号链接-p等于--preserve=模式,所有权,时间戳--preserve[=属性列表 保持指定的属性(默认:模式,所有权,时间戳),如果可能保持附加属性:环境、链接、xattr 等-c same as --preserve=context--sno-preserve=属性列表 不保留指定的文件属性--parents 复制前在目标目录创建来源文件路径中的所有目录-R, -r, --recursive 递归复制目录及其子目录内的所有内容--reflink[=WHEN] 控制克隆/CoW 副本。请查看下面的内如。--remove-destination 尝试打开目标文件前先删除已存在的目的地文件 (相对于 --force 选项)--sparse=WHEN 控制创建稀疏文件的方式--strip-trailing-slashes 删除参数中所有源文件/目录末端的斜杠-s, --symbolic-link 只创建符号链接而不复制文件-S, --suffix=后缀 自行指定备份文件的后缀-t, --target-directory=目录 将所有参数指定的源文件/目录复制至目标目录-T, --no-target-directory 将目标目录视作普通文件-u, --update copy only when the SOURCE file is newerthan the destination file or when thedestination file is missing-v, --verboseexplain what is being done-x, --one-file-systemstay on this file system-Z, --context=CONTEXTset security context of copy to CONTEXT--help 显示此帮助信息并退出--version 显示版本信息并退出3)、默认情况下,源文件的稀疏性仅仅通过简单的方法判断,对应的目标文件目标文件也被为稀疏。这是因为默认情况下使用了--sparse=auto 参数。如果明确使用--sparse=always 参数则不论源文件是否包含足够长的0 序列也将目标文件创文建为稀疏件。使用--sparse=never 参数禁止创建稀疏文件。4)、当指定了--reflink[=always] 参数时执行轻量化的复制,即只在数据块被修改的情况下才复制。如果复制失败或者同时指定了--reflink=auto,则返回标准复制模式。5)、备份文件的后缀为"~",除非以--suffix 选项或是SIMPLE_BACKUP_SUFFIX 环境变量指定。版本控制的方式可通过--backup 选项或VERSION_CONTROL 环境变量来选择。以下是可用的变量值:none, off 不进行备份(即使使用了--backup 选项)numbered, t 备份文件加上数字进行排序existing, nil 若有数字的备份文件已经存在则使用数字,否则使用普通方式备份simple, never 永远使用普通方式备份6)、有一个特别情况:如果同时指定--force 和--backup 选项,而源文件和目标文件是同一个已存在的一般文件的话,cp 会将源文件备份。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7284364.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-03
下一篇2023-04-03

发表评论

登录后才能评论

评论列表(0条)

    保存