shell函数递归调用实现目录的对比拷贝

目的与需求:

在移植时,需要将根文件系统rootfs1中的新增内容合入rootfs2,但不能覆盖rootfs2中原有的东西。即只能比较两个文件系统的异同,将1中比2中多出来的东西移到2中。

难点:

目录中若有相同的子目录,也要使得子目录满足上述需求。

点睛之笔:

shell 递归调用, 借鉴二叉树的深度优先遍历。

实操:

 1 #!/bin/bash
 2
 3 cpdifffile()
 4 {
 5
 6     DIR1=$1
 7     DIR2=$2
 8     files1=`ls $DIR1`
 9     #files2=`ls $DIR2`
10     for file1 in $files1
11     do
12         ls $DIR2/$file1 > /dev/null 2>&1
13         if [ $? -eq 0 ]
14         then
15             echo $DIR2 have file $file1
16         else
17             echo will cp $DIR1/$file1 to $DIR2
18             cp -a $DIR1/$file1 $DIR2/
19         fi
20     done
21 }
22
23 cpsamedir()
24 {
25     cpdifffile $1 $2
26     subdirs1=`ls -l $1 | grep "^d" | awk -F\  ‘{print $9}‘`
27     subdirs2=`ls -l $2 | grep "^d" | awk -F\  ‘{print $9}‘`
28     unset samedirs ##注意,此处要清空数组,否则上次调用的结果保存在这里将会形成环状,死循环
29     i=0
30     for subdir1 in $subdirs1
31     do
32         ls $2/$subdir1 > /dev/null 2>&1
33         if [ $? -eq 0 ]
34         then
35             samedirs[i]=$subdir1
36             let i++
37
38         else
39             echo  $1 have dir $subdir1, but  $2 not.
40         fi
41     done
42     echo "bettenw $1 and $2, the same dir is:"
43     echo ${samedirs[@]}
44
45     for samedir in ${samedirs[@]}
46     do
47         echo "now oparate $1/$samedir and $2/$samedir"
48         cpsamedir $1/$samedir $2/$samedir
49     done
50
51
52
53 }
54
55 main()
56 {
57     cpsamedir $1 $2
58
59 }
60
61 main $1 $2

原文地址:https://www.cnblogs.com/xxg1992/p/8858151.html

时间: 2024-11-09 00:03:31

shell函数递归调用实现目录的对比拷贝的相关文章

函数递归调用过程中的调用堆栈的情况

为了加深对函数递归调用过程中的理解,本Demo程序特意在VS2008 C#控制台程序实现了阶乘的计算功能,用于观察函数递归调用过程中的调用堆栈的情况. 源码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace RecursiveTset { class Program { //阶乘的定义:n!=n*(n-1)!,特别的,1!=1:0!=1 //阶乘的实

Shell脚本递归打印指定目录中所有目录文件

#!/bin/bash #递归打印当前目录下的所有目录文件. PRINTF() { ls $1 | while read line #一次读取每一行放到line变量中 do [ -d $1/$line ] && { DIR="$1/$line" echo $DIR } DIR1=`dirname $DIR` #求路径. A=`ls -F $DIR1 | grep / | grep "\<$line\>"` #判断line是不是一个目录.

函数-递归调用

一.什么是递归调用 递归调用:在函数调用过程中,直接或间接地调用了函数本身,这就是函数的递归调用1.递归的优点 递归函数的优点是定义简单,逻辑清晰.理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰. 使用递归函数需要注意防止栈溢出.在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧.由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出.可以试试fact(1000): 2.递归的缺点 解

python 关于函数递归调用自己

爬取b站博人传 每页短评20个,页数超过1000页, 代码如下 import requests import json import csv def main(start_url): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36',} res = requests.

用shell脚本递归遍历某个目录下的所有文件并移动到某个指定的目录中

1,先看下脚本cat recursive.sh #!/bin/shread -p "input path:" FilePath function getAllfiles(){for file in ls $FilePathdoif [ -f $file ]thenecho $filemv $file /bak_file/elif test -d $filethenecho "-------------------------------->"cd $fileF

函数递归调用

int main(int argc, const char * argv[]) { f(1,1,1000); return 0; } void f(int a,int b,int n) { if (a<n) { printf("%d\n",a); a=a+b; f(b,a,n); } else { printf("stop\n"); } }

C新手求助函数递归调用的理解!!很急!!

102klj寐滦宜陨咏腊<http://weibo.com/p683p410p/230927983046756163919872> wn8h3a揽埔悄状鼗埠<http://weibo.com/p108p588p/230927983024178431004672> wii6dd秆院郴罕幻脊<http://weibo.com/p753p931p/230927982698091037593600> qa0qw9醇桓娜赜凡诜<http://weibo.com/lwncwQ

Linux 两个目录浅对比拷贝

对比两个目录内容,然后拷贝! #!/usr/bin/python# -*-coding:utf-8 -*- import osimport sysimport shutil def get_dir_content(dir): dir_list = [] dir_files = os.listdir(dir) for dir_file in dir_files: if not dir_file.startswith('.'): dir_list.append(dir_file) return di

JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法

函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留言告诉我, 谢谢).因为调用对象是作用域链的一部分,所以在函数体内可以把这个对象属性作为变量来访问. 调用对象的属性包括:用var声明的局部变量,函数形参,还有一种特殊的属性arguments 函数的实际参数:实际参数对象 arguments对象,用来引用实际参数对象.函数的arguments对象并