#include"filecopy.c"

#include

#define SIZE 100

/*递归输出文件和目录的名字*/

int distance=0;

char src[SIZE],obj[SIZE],NAME[SIZE];

char *ptr=NAME;

static bool entry(char*path);

static bool walk(char*,bool(*fcn)(char*));

static bool push(char*);

static bool pop(char*);

static char *change(char*);

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

{

NAME[0]='\0';

if(argv[1][0]=='.') push(getcwd(NULL,0));

strcpy(src,NAME);

strcpy(obj,argv[2]);

/*确定源文件的根目录和目标文件的根目录*/

ec_false(entry(argv[1]))

/*从源文件的根目录开始工作*/

return 0;

FIX(return 1;)

}

static bool walk(char*path,bool(*func)(char*)) /*遍历一个目录,对其每个项目使用func函数*/

{

DIR *sp=NULL;

struct dirent *bp;

int fd=-1;

struct stat st;

ec_null(sp=opendir(path))

ec_neg1(fd=open(".",O_RDONLY))/*当前目录为待遍历的目录,先记录,再跳转*/

ec_neg1(chdir(path))

while(errno=0,(bp=readdir(sp))!=NULL){

if(strcmp(bp->d_name,".")==0||strcmp(bp->d_name,"..")==0) continue;

else{

ec_false((*func)(bp->d_name))

}

}

fchdir(fd);

closedir(sp);

return true;

EC_CLEANUP_BGN

fchdir(fd);

closedir(sp);

return false;

EC_CLEANUP_END

}

static bool entry(char*path)

{

struct stat st;

ec_neg1(lstat(path,&st))

int j;

if((st.st_mode&S_IFMT)==S_IFDIR){

distance++;

for(j=1;j

if(path[0]!='.')push(path);

printf("%s to %s\n",NAME,change(NAME));

ec_neg1(mkdir(change(NAME),PERM_DIRECTORY))

ec_false(walk(path,entry))

if(path[0]!='.')pop(path);

distance--;

}

else{

for(j=1;j

push(path);

printf("%s to %s\n",NAME,change(NAME));

ec_false(filecopy(path,change(NAME)))

pop(path);

}

return true;

FIX(return false;)

}

static bool push(char*s)

{

char*p;

p=s;

if(*ptr!='/'&&s[0]!='/')*ptr++='/';

while(*p)

*ptr++=*p++;

*ptr='\0';

if(ptr-NAME<100)return true;

return false;

}

static bool pop(char*path)

{

int i=strlen(path);

if(*ptr=='/')ptr--;

while(i-->=0) ptr--;

if(ptr!=NAME)*ptr='\0';

if(ptr>NAME)return true;

return false;

}

static char *change(char*overpath) /*将完整的源文件名称转换为完整的目标文件名称*/

{

char *result=(char*)malloc(SIZE*sizeof(char)),*p1,*p2;

strcpy(result,obj);

p1=overpath;

p2=src;

while(*p2++)p1++;

strcat(result,p1);

return result;

}

简单介绍一下各个函数:

main函数:处理命令行变元,产生源文件的根目录和目标文件的根目录;特别的,假如源文件的根目录以“.”表示的话,要用getcwd(获取当前路径)的返回值来替换。

entry函数(进行核心工作):

对一个文件进行如下工作:

(1)是一个目录,那么将名称入栈,调用walk函数遍历之,并向屏幕输出待复制的源目录和目标目录,遍历完以后名称要出栈;如果可能,复制目录

(2)是一个文件,除了不遍历,其他相同;

walk函数:用func所指向的回调函数(其实就是entry函数)遍历一个目录

注意:entry函数和walk函数互相调用,构成递归

push函数和pop函数:将给定的文件/目录名字出栈或者入栈,构成一个完整的路径名

change函数:根据给点的源文件根目录和目标文件根目录,将一个完整的源路径名称转换为一个完整的目标文件名称。

目录下内容的递归复制Linux,linux下递归复制文件及目录相关推荐

  1. Linux rm命令:删除文件或目录

    当 Linux 系统使用很长时间之后,可能会有一些已经没用的文件(即垃圾),这些文件不但会消耗宝贵的硬盘资源,还是降低系统的运行效率,因此需要及时地清理. rm 是强大的删除命令,它可以永久性地删除文 ...

  2. Linux系统管理命令之管理文件和目录

    内部命令与外部命令的区别: 内部命令是Shell自带能用help查看的命令. 外部命令为第三方软件安装的命令 一些快捷键: Tab:自动补全命令. 反斜杠"\":强制换行后在下一行 ...

  3. Ubuntu Linux 解决 bash ./ 没有那个文件或目录 的方法

    Ubuntu Linux 解决 bash ./ 没有那个文件或目录 的方法 遇到这个问题是为了sublime配置c/c++ 编译环境 当运行程序打开终端时 出现以上问题 先新建build system ...

  4. linux删除文件不需要确定,linux的rm命令-删除文件或目录

    linux的rm命令-删除文件或目录 英文原意:remove 命令所在路径:/bin/rm 语法:rm -r 文件或目录,为目录时要加-r,且删除需要用户确认,如果不需要用户确认则 语法为:rm -r ...

  5. linux 没有那个文件或目录,Linux 解决 bash ./ 没有那个文件或目录 的方法

    在Debian 或 ubuntu 64位下运行 ./xxx 会跳出来说没有这个文件或者目录,但是ls看又有这个文件,很是奇怪. 其实原因很简单,是因为他没有32位的运行库 ia32-libs ,直接安 ...

  6. 如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录

    如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录 参考文章: (1)如何解决编译linux内核(解决声卡问题),遭遇fata ...

  7. linux复制并重命名文件名称,linux 复制,移动,重命名文件或目录

    前言 linux 文件/目录操作 文件/目录创建和删除之前也写过,链接 1.文件/目录复制 cp [选项] 源文件或目录 目标文件或目录 这个命令可以在复制的同时改变名字 eg, cp abc.log ...

  8. linux 复制,移动,重命名文件或目录

    前言 linux 文件/目录操作 文件/目录创建和删除之前也写过,链接 1.文件/目录复制 cp [选项] 源文件或目录 目标文件或目录 这个命令可以在复制的同时改变名字 eg, cp abc.log ...

  9. 文件节点的linux指令,Java工程师必学的Linux命令(一)文件与目录管理

    从本篇文章开始,我将总结一些Java工程师日常研发工作中会使用到的Linux命令,在介绍这些命令的过程中,也会对Linux系统的一些基础知识进行普及.希望对大家工作和学习有所帮助吧. 本篇将从文件与目 ...

  10. Linux学习笔记三【文件及目录的权限管理篇】

    文件及目录的权限管理 上篇简单介绍了下文件和目录的一些简单的操作,接下来介绍用户和文件权限的管理.首先了解用户和组账号的配置文件,然后是管理用户和组账号,最后要会设置文件和目录权限和归属. Linux ...

最新文章

  1. 全基因组关联分析中上位性检测算法的研究
  2. php数字导出excel表格中_php怎么把数据表中的数据导出到excel表中
  3. freebsd 运维人员
  4. 英利1500伏光伏组件系列亮相美国
  5. Devoxx的Red Hat Engineers提供了更多Java EE
  6. String类的一些常见的获取方法(5)
  7. 借助 Cloud Toolkit 快速创建 Dubbo 工程
  8. 计算机应用领域变化,计算机应用领域与发展阶段.ppt
  9. 帮助中心 开源_如何不获得开源帮助
  10. 解决mac修改docker容器报错[screen is terminating]
  11. pythonwindows文件_python查询windows文件
  12. 苹果 Mac 图标设计背后的故事!
  13. linux eclipse web项目,Eclipse中web项目部署至Tomcat步骤
  14. JQUERY 使用键盘左右键切换选项卡
  15. 字模提取软件怎么放大_图片无损放大软件 Topaz Gigapixel AI
  16. tensorflow2没有slim模块
  17. python12306抢票_GitHub - versionzhang/python_12306: python 12306 抢票工具
  18. 注册表右键添加打开选项
  19. 开源知识管理系统_半个月收获接近 1k 的点赞!你需要的开源项目都在这里
  20. elasticsearch入门笔记

热门文章

  1. 用信号量进程同步与互斥
  2. bzoj5406: Gift
  3. GetConsoleTitle 函数--获取控制台窗口标题
  4. css表示屏幕宽度和高度
  5. 每天一个linux命令(55)--at命令
  6. Android 分析工具 APKAnalyser
  7. sqlserver临时表操作
  8. Struts 1.x 的工作原理
  9. WebMaster如何处理网站内容重复?
  10. java .jar怎么打开_jar文件怎么打开,小编教你如何打开jar文件