BASH:编写一个脚本来递归遍历 N 级目录 [英] BASH: Writing a Script to Recursively Travel a Directory of N Levels

查看:30
本文介绍了BASH:编写一个脚本来递归遍历 N 级目录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

例如我有以下目录结构:

I have the following directory structure for example:

/test_dir/d
/test_dir/d/cron
/test_dir/d/cache
/test_dir/d/...(more sub dirs)
/test_dir/tree
/test_dir/tree/a
/test_dir/tree/a/a1
/test_dir/tree/a/a2
...(and so on for b/ and c/ )

我已经编写了以下 bash 脚本,可以有效地传送到 /test_dir 的第二级,因此它将到达 /test_dir/d/cron/test_dir/tree/a 但不会更进一步.我无法弄清楚为什么递归脚本不会进一步传播,有人可以调试脚本并指出我的错误吗?

I've written the following bash script that effectively travels to the second level of /test_dir so it will reach /test_dir/d/cron or /test_dir/tree/a but will not go further. I cannot figure out why the recursive script will not travel further can someone please debug the script and point out my error?

这是我写的:

#!/bin/bash

#script to recursively travel a dir of n levels

function traverse() {   

for file in `ls $1`
do
    #current=${1}{$file}
    if [ ! -d ${1}${file} ] ; then
        echo " ${1}${file} is a file"
    else
        #echo "entering recursion with: ${1}${file}"
            traverse "${1}/${file}"
    fi
done
}

function main() {
    traverse $1
}

main $1

这里是输出:

/test_dir/a is a file
/test_dir/b is a file
/test_dir//dcache is a file
/test_dir//dcron is a file
/test_dir//dgames is a file
/test_dir//dlib is a file
/test_dir//dlog is a file
/test_dir//drun is a file
/test_dir//dtmp is a file
/test_dir/movies is a file
/test_dir//treea is a file
/test_dir//treeb is a file
/test_dir//treec is a file
/test_dir//treed is a file

我知道可能有更优雅的单行命令来执行此操作.但我试图以这种明确的方式做到这一点.对于这篇文章的长度,我深表歉意.

I know there are probably more elegant one line commands to do this. But im trying to do it in this explicit manner. I apologize for the length of this post.

使用 traverse "${1}/${file}"

推荐答案

脚本的几个问题.应该是这样的:

Several problems with the script. It should be like this:

#!/bin/bash

#script to recursively travel a dir of n levels

function traverse() {
for file in "$1"/*
do
    if [ ! -d "${file}" ] ; then
        echo "${file} is a file"
    else
        echo "entering recursion with: ${file}"
        traverse "${file}"
    fi
done
}

function main() {
    traverse "$1"
}

main "$1"

但是,递归遍历目录的正确方法是使用 find 命令:

However, the correct way to recursively traverse a directory is by using the find command:

find . -print0 | while IFS= read -r -d '' file
do 
    echo "$file"
done

这篇关于BASH:编写一个脚本来递归遍历 N 级目录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆