精华内容
下载资源
问答
  • cp指令

    千次阅读 2018-07-01 23:37:45
    cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文件...

    简介

    cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。

    语法

    cp [选项] [参数]

    选项

    -a:此参数的效果和同时指定"-dpR"参数相同;
    -d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;
    -f:强行复制文件或目录,不论目标文件或目录是否已存在;
    -i:覆盖既有文件之前先询问用户;
    -l:对源文件建立硬连接,而非复制文件;
    -p:保留源文件或目录的属性;
    -R/r:递归处理,将指定目录下的所有文件与子目录一并处理;
    -s:对源文件建立符号连接,而非复制文件;
    -u:使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件;
    -S:在备份文件时,用指定的后缀“SUFFIX”代替文件的默认后缀;
    -b:覆盖已存在的文件目标前将目标文件备份;
    -v:详细显示命令执行的操作。

    参数

    - 源文件:指定源文件列表。默认情况下,cp命令不能复制目录,如果要复制目录,则需要加 [-R] 选项。
    - 目标文件:指定目标文件。当源文件为多个时,要求指定 “目标文件” 为目录。
    

    实例

    如果把一个文件复制到目标文件中,而目标文件已经存在。那么该目标文件的内容将被清空。此命令中的路径参数既可以是绝对路径,也可以是相对路径。通常会用到 ‘.’ 或 ‘..’ 的形式,例如下面的命令是将指定文件复制到当前目录下。

    cp ../code/mycp.c ./

    如果没有文件的复相关权限,则命令会报错。
    将 test1 复制到 /home/jelly 目录下并改名为 test2:

    cp test1 /home/jelly/test2

    我们在 linux 下复制文件的时候,有时候会覆盖同名文件,此时会有选项 [Y/n] 让我们选择是否需要覆盖对应文件。

    cp命令执行拓扑图

    这里写图片描述

    命令核心代码

    cp命令的核心点之一是拷贝目录文件。对目录文件的拷贝,实际上是对该目录下的所有文件的拷贝。显然,这是一个递归的过程。

    我们循环读取目录下的每个文件,对于 ‘.’ 和 ‘..’ 不做任何处理,将读到的其它文件作为新的源文件(记得要拼接新的源文件路径),然后针对该文件的类型,选择调用 “cp_file” 或者 “cp_dir”。实际上,linux下的文件类型有7种,我们应该对于每种类型,都实现一个拷贝函数,但此处仅仅是一个简洁版本,所以只处理目录文件和普通文件两种。

    首先介绍读目录相关的接口:

    DIR *opendir(const char *name);
    功能:打开一个目录;
    参数:目录的路径;
    返回值:若打开成功返回一个指向文件流的指针,用户可以通过该指针访问目录下的文件,若打开失败,则返回 NULL;
    说明:一般情况下打开失败的原因包括:
     1) 路径为空或者路径非法;
     2) 进程可打开的文件描述符数量达到上限;
     3) 系统可打开的文件描述符达到上限.
    struct dirent *readdir(DIR *dirp);
    功能:读取目录的内容; 
    参数:指向文件流的指针;
    返回值:若 执行成功,返回指向文件文件结构体(结构体内容如下)的指针,若读到目录结尾,则返回 NULL。   

    下面是拷贝目录的代码:

    int cp_dir(const char *src, const char *dst, mode_t mode){
        LOG("copy dir: '%s' to '%s'\n", src, dst);
        if(src == NULL || dst == NULL){
            return -1;
        }
        (void)mode;
        DIR *fd_dst = opendir(src);
        struct dirent *fd_read = NULL;
        while((fd_read=readdir(fd_dst)) != NULL) {
            if(fd_read->d_name[0] == '.'){
                continue;
            }
    
            char *path_src = (char*)malloc(strlen(src)+strlen(fd_read->d_name)+1);
            sprintf(path_src, "%s/%s", src, fd_read->d_name);
            char *path_dst = (char*)malloc(strlen(dst)+strlen(fd_read->d_name)+1);
            sprintf(path_dst, "%s/%s", dst, fd_read->d_name);
            struct stat sbuf;
            memset(&sbuf, 0x00, sizeof(sbuf));
            if(stat(path_src, &sbuf) == -1){
                LOG("file stat error!\n");
            }
            if(S_ISREG(sbuf.st_mode)){//源是文件
                cp_file(path_src, path_dst, sbuf.st_mode);
            }else if(S_ISDIR(sbuf.st_mode)){//源是目录
                mkdir(path_dst, sbuf.st_mode);
                cp_dir(path_src, path_dst, sbuf.st_mode);
            }
            free(path_src);
            free(path_dst);
        }
        return 0;
    }

    文件的拷贝实际上是将源文件内容读出来,然后写到目标文件中,具体代码如下:

    int cp_file(const char *src, const char *dst, mode_t mode){
        LOG("copy file: '%s' to '%s'\n", src, dst);
        if(src == NULL || dst == NULL){
            return -1;
        }
        int fd_src = open(src, O_RDONLY);
        if(fd_src == -1){
            LOG("open src file error: %s\n", src);
        }
        int fd_dst = open(dst, O_WRONLY | O_CREAT, mode);
        if(fd_dst == -1){
            LOG("open dst file error: %s\n", dst);
        }
        char buff[1024] = {0};
        ssize_t size = 0;
        int totol_size = 0;
        while((size = read(fd_src, buff, 1023)) > 0){
            totol_size += size;
            buff[size] = '\0';
            write(fd_dst, buff, size);
            memset(buff, 0x00, 1024);
        }
        return totol_size;
    }

    完整代码

    #include <stdio.h>
    #include <time.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <fcntl.h>
    #include <dirent.h>
    #include <libgen.h>
    
    #ifdef DEBUG
    #define LOG(format, ...)                                                                   \
    do{                                                                                         \
        time_t t = time(0);                                                                     \
        struct tm ptm;                                                                          \
        memset(&ptm, 0, sizeof(ptm));                                                           \
        localtime_r(&t, &ptm);                                                                  \
        printf("[LOG][%4d-%02d-%02d %02d:%02d:%02d][%s:%s:%d]:\033[31m " format "\033[0m", \
                ptm.tm_year + 1900, ptm.tm_mon + 1, ptm.tm_mday, ptm.tm_hour,                   \
                ptm.tm_min, ptm.tm_sec, __FILE__, __FUNCTION__ , __LINE__, ##__VA_ARGS__);      \
        fflush(stdout);                                                                         \
    }while(0)
    #else
    #define LOG(format, ...)                                                                   
    #endif
    
    int cp_file(const char *src, const char *dst, mode_t mode);
    int cp_dir(const char *src, const char *dst, mode_t mdoe);
    
    
    int main(int argc, char *argv[]){
        if(argc != 3){
            usage(argv[0]);
            exit(0);
        }
    
        if(strcmp(argv[1], argv[2]) == 0){
            LOG("cp: cannot copy a directory, '%s', into itself, '%s/%s'\n", argv[1], argv[1], argv[2]);
            exit(0);
        }
    
    
        struct stat sbuf;
        memset(&sbuf, 0x00, sizeof(sbuf));
        if(stat(argv[1], &sbuf) == -1){
            LOG("file stat error!\n");
        }
    
        if(S_ISREG(sbuf.st_mode)){//源是文件
            LOG("src is file\n");
            struct stat dbuf;
            memset(&dbuf, 0x00, sizeof(dbuf));
            if(stat(argv[2], &dbuf) == -1){//目标不存在
                LOG("dst not exist\n");
                cp_file(argv[1], argv[2], sbuf.st_mode);
            }else if(S_ISREG(dbuf.st_mode)){//目标是文件
                LOG("dst is file\n");
                char c = 'n';
                printf("cover dst file? [Y/n]");
                scanf(" %c", &c);
                if(c == 'y' || c == 'Y'){
                    truncate(argv[2], 0);
                    cp_file(argv[1], argv[2], sbuf.st_mode);
                }
            }else if(S_ISDIR(dbuf.st_mode)){//目标是目录
                LOG("dst is dir\n");
                char temp[1024] = {0};
                sprintf(temp, "%s/%s", argv[2], argv[1]);
                cp_file(argv[1], temp, sbuf.st_mode);
            }
        }else if(S_ISDIR(sbuf.st_mode)){//源是目录
            LOG("src is dir\n");
            struct stat dbuf;
            memset(&dbuf, 0x00, sizeof(dbuf));
            if(stat(argv[2], &dbuf) == -1){//目标不存在
                LOG("dst not exist\n");
                mkdir(argv[2], sbuf.st_mode);
                cp_dir(argv[1], argv[2], sbuf.st_mode);
            }else if(S_ISDIR(dbuf.st_mode)){//目标是目录
                LOG("dst is dir\n");
                char temp[1024] = {0};
                sprintf(temp, "%s/%s", argv[2], argv[1]);
                mkdir(temp,sbuf.st_mode);
                cp_dir(argv[1], temp, sbuf.st_mode);
            }else{//非法操作
                LOG("mycp: cannot overwrite non-directory [%s] with directory [%s]\n", argv[2], argv[2]);
            }
        }
    
        return 0;
    }
    

    总结

    我们实现的 cp 命令不到 200 行,而 linux 系统中的实现有 2000 行左右,所以,我们的版本还有许多改进的地方,比如:增加拷贝各种类型文件的功能,采用其它内核读取文件的接口以提高时效性。

    展开全文
  • 目录:1.cp指令:拷贝文件或文件夹(1)cp拷贝文件(2)cp拷贝文件夹(3)拷贝完成之后进行重命名(4)练习2.mv指令:移动或者重命名(1)移动(2)重命名3.echo指令:往文件中写简单的内容4.cat指令:查看文件内容5.zip指令:...

    1.cp指令:拷贝文件或文件夹

    (1)cp拷贝文件

    • cp [待拷贝文件] [拷贝路径]
    在这里插入图片描述

    (2)cp拷贝文件夹

    • cp -r [待拷贝文件夹] [拷贝路径]
    在这里插入图片描述

    (3)拷贝完成之后进行重命名

    • cp [待拷贝文件] [拷贝路径][newname]
    在这里插入图片描述

    (4)练习

    1.在当前用户的家目录下,创建一个文件,名字为hello
    2.在当前用户的家目录下,创建一个文件夹,名字为linux
    3.将hello文件拷贝到linux文件夹下
    4.将hello文件拷贝到linux文件夹下并重命名为aaa名称
    此时linux文件夹下一个存在两个文件,一个hello,一个aaa

    在这里插入图片描述

    2.mv指令:移动或者重命名

    (1)移动

    • mv [待移动的文件或文件夹] [路径]
    在这里插入图片描述

    (2)重命名

    • mv [待替换文件的名称] [替换之后的名称]
    在这里插入图片描述

    3.echo指令:往文件中写简单的内容

    • echo “字符串” > [文件名]
    在这里插入图片描述

    4.cat指令:查看文件内容

    • cat [文件名]
    在这里插入图片描述

    5.zip指令:压缩文件或文件夹

    (1)压缩文件

    • zip [压缩完成之后的名称].zip [待压缩文件名称]
    在这里插入图片描述

    (2)压缩文件夹

    • zip -r [压缩完成之后的名称].zip [待压缩文件夹名称]
    在这里插入图片描述

    6.unzip指令:解压缩(文件或文件夹)

    • unzip [待解压的文件或文件夹]
    不管是文件还是文件夹压缩之后的压缩文件,都可以用unzip解压缩
    在这里插入图片描述

    7.tar指令:压缩文件或文件夹

    gzip压缩

    (1)可压缩文件和文件夹

    • tar -zcvf [压缩后的名称].tar.gz [待压缩的文件或文件夹]
    在这里插入图片描述

    (2)可解压缩文件和文件夹

    • tar -zxvf [待解压缩的文件或文件夹].tar.gz
    在这里插入图片描述

    (3)命令行参数的含义

    z:代表gzip压缩
    c:代表creat,创建压缩文件的含义
    v:代表view,展示压缩过程或者解压的过程
    f:代表指定压缩文件名称,f命令参数后面必须跟压缩或解
    压缩文件的名称,f命令行参数后面不能再跟其他命令行参数
    x: 解压缩

    bzip2压缩

    (1)可压缩文件和文件夹

    • tar -jcvf [压缩后的文件或文件夹名称].tar.bz2 [待压缩的文件或文件夹]
    在这里插入图片描述

    (2)可解压缩文件和文件夹

    • tar -jxvf [待解压缩的文件或文件夹].tar.bz2
    在这里插入图片描述

    (3)命令行参数的含义

    j:代表使用bzip2压缩

    8.find指令:查找文件

    • find [路径] -name [文件名称]
    在这里插入图片描述

    8.grep指令:查找文件当中的字符串

    (1)第一个作用:查找字符串

    • grep “字符串” -r [路径]
    在这里插入图片描述

    (2)第二个作用:配合管道符号,过滤其他命令的输出结果

    加上管道符号之后,是将 ll 命令的输出结果,通过管道传递给grep命令,作为grep命令的输入参数,让grep命令进行过滤
    在这里插入图片描述

    9.切换用户

    (1)从普通用户切换到root用户

    • su - root 或 su root
    在这里插入图片描述

    (2)切换之后,推出到普通用户,用exit命令

    在这里插入图片描述

    (3)从普通用户切换到普通用户

    • su [用户名称]

    10.tree指令:可以查看文件目录结构

    使用此命令需要先安装

    (1)安装:切换到root用户,执行yum -y install tree

    在这里插入图片描述

    (2)使用方法

    • tree [路径]
    在这里插入图片描述

    展开全文
  • cp指令的简单实现

    2015-08-15 09:23:28
    Linux C简单实现cp指令,复制文件,文件夹,但是没有用户交互和操作选项
  • 执行cp指令之后,提示:cp: 略过目录"picture",如下图所示 那么如何解决这个问题呢?我们首先得明白 cp 指令它的用法以及含义 【语法】cp [选项]源文件或目录 目标文件或目录 【含义】该指令将指定的源文件...

    执行cp指令之后,提示:cp: 略过目录"picture",如下图所示

    那么如何解决这个问题呢?我们首先得明白 cp 指令它的用法以及含义

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

    含义】该指令将指定的源文件复制到目标文件或将多个源文件复制到目标目录中。

    那么,略过目录此时就可以理解为拷贝失败。

    注:Linux 拷贝文件夹时,一般要加参数:-r 或者 -af

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

    如上所示的 picture 以及 hha 均为目录名,故应更改为:

    此时,get√

    展开全文
  • Linux下的cp指令

    2017-07-26 23:02:43
    Linux下的cp指令 1.功能 复制文件或目录 说明:cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定...

    Linux下的cp指令

    1.功能
    复制文件或目录
    说明:cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并不是一个已存在的目录,则会出现错误信息。
    2.参数
    -a 或 --archive此参数的效果和同时指定"-dpR"参数相同
    -b 或 --backup删除、覆盖目的文件先备份,备份的文件或目录建立为符号链接,并指向源文件或目录链接的源文件或目录。假如没有加上这个参数,在复制的过程中若遇到符号链接则会直接复制源文件或目录
    -f 或 --force 强行复制文件或目录,不论目的文件或目录是否已经存在
    -i 或 --interactive 覆盖文件之前先询问用户
    -l 或 --link 对源文件建立硬链接,而非复制
    例如:cp -l hard_file hard_link,追加内容到hard_file,查看文件大小,查看inode: ll -i
    -p 或 --preserve保留源文件或目录的属性,包括所有者、所属组、权限与时间
    -P 或 --parents保留源文件或目录的路径,此路径可以是绝对路径或相对路径,且目的目录必须已经存在
    -r 递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态不属于目录或符号链接,则一律视为普通文件处理
    -R 或 --recursive递归处理,将指定目录下的文件及子目录一并处理
    -s 或 -symbolic-link对源文件建立符号链接,而不是复制文件
    -S <备份字尾字符串> 或 --suffix=<备份字尾字符串>用"-b"参数备份目的文件后,备份文件的字尾会被加上一个备份字符串。默认的备份字尾字符串是符号"~"
    -u 或 --update 使用该参数后,只会在源文件的修改时间较目的文件更新时,或是名称对应的目的文件并不存在才复制文件
    -v 或 --verbose 显示执行过程
    -V <备份方式> 或 --version-control=<备份方式>指定当备份文件时,备份文件名的命名方式有以下三种:
    (1)numbered或t,将使用备份编号,会在字尾加上~l~字符串,其数字编号依次递增
    (2)simple或nerver将使用简单备份,默认备份字尾字符串是~,也可通过-S来指定
    (3)existing或nil将使用当前方式,程序会先检查是否存在着备份编号,若有则采用备份编号,若无则采用简单备份
    -x 或 --one-file-system 复制的文件或目录存放的文件系统必须与cp指令执行时所处的文件系统相同,否则不复制,也不处理位于其他分区的文件
    --help 显示在线帮助
    --sparse=<使用时机> 设置保存稀疏文件的时机
    --version 显示版本

    示例:
    (1)复制文件,只有源文件比目的文件的修改时间新时,才复制文件
         cp -u -v file1 file2
    (2)将文件file1复制成文件file2
              cp file1 file2
    (3)采用交互式将文件file1复制成file2
              cp -i file1 file2
    (4)将文件file1复制成file2,因为目的文件已经存在,所以指定使用强制复制的模式
              cp -f file1 file2
    (5)将目录dir1复制成目录dir2
              cp -R file1 file2
    (6)同时将文件file1、file2、file3与目录dir1复制到dir2
              cp -R file1 file2 file3 dir1 dir2
    (7)复制时保留文件属性
              cp -p a.txt tmp/
    (8)复制时保留文件的目录结构
              cp -P /var/tmp/a.txt ./temp/
    (9)复制时产生备份文件,尾标 ~l~格式
       cp -b -V t a.txt  /tmp
    (10)指定备份文件尾标
              cp -b -S _bak a.txt /tmp
    展开全文
  • cp 指令 在unix里运行 ./cp1 file1 file2 copy 一个文件file1 然后写入到 创建文件file2
  • linux cp指令:略过目录 问题解决

    万次阅读 多人点赞 2018-05-21 09:21:27
    linux下使用cp指令将文件夹test复制到另一目录下时,出现以下错误:解决方法:使用cp -r 源文件 目标目标- r :若源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。当然,目标文件必须为一个目录名...
  • cp指令前面加反斜杠可以不弹出是否覆盖的询问而直接覆盖! 如:cp /app/WEB-INF/com/cfg.properties /app_bak/WEB-INF/com/cfg.properties 会弹出询问是否覆盖  \cp/app/WEB-INF/...
  • cp指令使用

    千次阅读 2019-05-26 20:32:06
    将查找到的文件复制到指定文件夹下: find /home/user/bin/anaconda3/pkgs/ -name “*tar.bz2” |xargs -i cp -r {} /home/user/download/tar_bz2/
  • 项目名称:实现Linux下cp指令的代码实现。 目的:Linux文件I/O实现cp指令的代码,掌握常用的文件I/O函数:open、read、write、lseek、close。并懂得运用。 (若不会常用的函数使用,请参照上一篇博客——linux下...
  • 用C语言实现Linux系统的cp指令

    千次阅读 2019-01-09 10:17:23
    在实现cp指令之前,首先先要了解这样一个概念,我们平时在写代码时 int main() 这个括号里省略了3个参数。 int main(int argc,char** argv,char** environ) //argc 表示参数的数量 //argv 是一个字符串...
  • http://man.linuxde.net/cp ...linux指令 来将 来自: http://man.linuxde.net/cp 现 来自: http://man.linuxde.net/cp 现 来自: http://man.linuxde.net/cp 现 来自: http://man.linuxde.net/cp
  • 这里 xargs cp 怎么区分cp源 和 cp目的 例如:想把 查询到的文件 都copy到/home/users/中去  find . -name "*" | xargs cp /home/users/ cp命令在这里就变成:cp /home/users/ Find_file 默认从管道传来的值是...
  • 由于 cp alias 了 cp -I, 所以覆盖文件的时候始终会有提示。 解决办法: 使用转义字符取消alias /cp aaa.bak aaa 这样,覆盖的时候就不会有提示了。 Marked by knityster
  • CP1E指令参考手册

    2011-09-22 15:10:32
    CP1E指令参考手册,如何使用,编程。omron欧姆龙相关手册
  • CP1E手册(指令手册)

    2021-03-18 22:02:09
    CP1E手册(指令手册).pdf 介绍了关于CP1E手册(指令手册)的详细说明,提供PLC的技术资料的下载。
  • OMRON CP1E指令参考手册

    2014-08-15 19:41:01
    OMRON CP1E CPU 编程指令参考手册
  • SYSMAC CP 系列 CP1H CPU 单元 CP1H-X40D□-□ CP1H-XA40D□-□ CP1H-Y20DT-D CP1L CPU 单元 CP1L-L14D□-□ CP1L-L20D□-□ CP1L-M30D□-□ CP1L-M40D□-□ 中文指令手册 编程手册
  • Linux指令cp

    2018-04-03 17:50:01
    #以下内容来自菜鸟教程,为了方便查看,特此记录Linux的cp命令主要用于复制文件或目录。语法:cp [options] source dest或cp [options] source... directory#options 操作指令集合;source:源文件;dest:目的文件#...
  • OMRON CP1H 高级指令分析(一)数据比较指令
  • OMRON CP1H 高级指令分析(二)数据传送指令
  • cp:即copy,复制文件,文件夹指令 mv:即move,移动文件,文件夹指令,同时也可以用来重命名文件,文件夹 ...2.cp指令后加-i选项,如果目标目录下已有同名文件或者文件夹,会先询问是否覆盖文件或者文件夹。例如 cp

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 110,334
精华内容 44,133
关键字:

cp指令