美文网首页shell
Shell脚本递归遍历目录

Shell脚本递归遍历目录

作者: 鹅鹅鹅_ | 来源:发表于2018-12-14 10:07 被阅读0次

有的时候,处理文件真是一层目录包含一层目录的,即使是用脚本处理,如果不使用递归处理目录的方法,也会很麻烦。今天就来介绍一下如何在Linux下使用shell脚本递归的遍历一个目录。

  • 1、tree.sh
    其中的两个全局变量用来验证是否处理正确,应和系统命令tree统计出来的结果相对应。

    [root@master dancicizu]# cat tree.sh 
    #! /bin/sh
    
    #number of directories and files
    DS=0
    FS=0
    #1st param, the dir name
    #2nd param, the aligning space
    function listFiles(){
        for file in `ls "$1"`
        do
            if [ -d "$1/${file}" ];then
                echo "$2${file}"
                ((DS++))
                listFiles "$1/${file}" " $2"
            else
                echo "$2${file}"
                ((FS++))
            fi
        done    
        
    }
    
    listFiles $1 "    "
    echo "${DS} dictories,${FS} files"
    
    
  • 2、测试
    这里,我新建了test目录,此目录下还有多层目录。

    #首先使用系统命令tree来打印此目录的层级关系
    [root@master dancicizu]# tree test/
    test/
    ├── a.txt
    ├── b.txt
    ├── C
    │   └── E
    │       └── F
    └── D
        ├── e.txt
        └── f.txt
    
    4 directories, 4 files
    #然后使用自写tree.sh脚本来打印此目录的层级关系
    [root@master dancicizu]# ./tree.sh test
        a.txt
        b.txt
        C
         E
          F
        D
         e.txt
         f.txt
    4 dictories,4 files
    
    
  • 3、应用
    有了递归遍历目录的脚本方法,我们就可以方便的进行许多处理工作了,比如,批量递归的对一个目录进行dos2unix转换:

    [root@master dancicizu]# cat tree.sh 
    [root@master dancicizu]# cat tree.sh 
    #! /bin/sh
    
    #number of directories and files
    DS=0
    FS=0
    #1st param, the dir name
    #2nd param, the aligning space
    function listFiles(){
        for file in `ls "$1"`
        do
            if [ -d "$1/${file}" ];then
                #echo "$2${file}"
                ((DS++))
                listFiles "$1/${file}" " $2"
            else
                #echo "$2${file}"
                dos2unix "$1/${file}"
                ((FS++))
            fi
        done    
        
    }
    
    listFiles $1 "    "
    echo "${DS} dictories,${FS} files"
    
    
    [root@master dancicizu]# ./tree.sh test
    [root@master dancicizu]# ./tree.sh test/
    dos2unix: converting file test//a.txt to UNIX format ...
    dos2unix: converting file test//b.txt to UNIX format ...
    dos2unix: converting file test//D/e.txt to UNIX format ...
    dos2unix: converting file test//D/f.txt to UNIX format ...
    4 dictories,4 files
    
    
    

    再比如,递归解压7z文件:

    #! /bin/sh
    
    #number of directories and files
    DS=0
    FS=0
    #1st param, the dir name
    #2nd param, the aligning space
    function listFiles(){
        for file in `ls "$1"`
        do
            if [ -d "$1/${file}" ];then
            #   echo "$2${file}"
                ((DS++))
                listFiles "$1/${file}" "$2"
            else
            #   echo "echo "$2${file}""
            #   nn=$(echo "$1/${file}" | tr -t '/' '-' | tr -t ' ' '')
            #   mv "$1/${file}" "${nn}"
            #   dos2unix "$1/${file}"
                if [[ "${file}" =~ ".7z" ]];then
                    echo "${file}"
                    cd $1
                    #强制覆盖已经存在的同名文件
                    7za x -aoa "${file}"
                    if [ $? == 0 ];then
                        rm -f "${file}"
                    fi
                    cd -
                fi
                ((FS++))
            fi
        done    
        
    }
    
    listFiles $1 ""
    echo "${DS} dictories,${FS} files"
    
    

相关文章

网友评论

    本文标题:Shell脚本递归遍历目录

    本文链接:https://www.haomeiwen.com/subject/wuywhqtx.html