You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Shell脚本技术问询:如何修改脚本以打印主目录下所有子目录中的文件

解决递归列出子目录中所有文件的问题

嘿,我来帮你搞定这个问题!你的当前脚本只能列出主目录下的直接条目(包括子目录本身),但没法深入到子目录内部去列出里面的文件对吧?别担心,有几个简单又实用的方法能解决这个需求:

方法1:用find命令(最简便高效)

find命令本身就是为递归查找文件/目录设计的,直接用它就能一步到位:

read filename
# 只列出所有子目录里的文件(不包含目录本身)
find "$filename" -type f
# 如果想同时列出所有目录和文件,去掉 -type f 参数即可
# find "$filename"
  • -type f 参数用来指定只查找文件,如果你的需求是连目录也一起输出,直接删掉这个参数就行。
  • 这个方法不需要额外配置,所有类Unix系统基本都自带find,兼容性拉满。

方法2:开启Bash的globstar选项

Bash有个globstar扩展功能,能让**匹配任意深度的子目录,用它可以改造你的循环:

# 先开启globstar功能(Bash 4.0及以上版本支持)
shopt -s globstar
read filename
# 遍历所有层级的条目
for entry in "$filename"/**/*
do
    # 只输出文件,过滤掉目录
    if [ -f "$entry" ]; then
        echo "$entry"
    fi
done
# 可选:用完后关闭globstar,避免影响后续脚本
shopt -u globstar
  • **会递归遍历$filename下的所有子目录,/**/*就代表所有层级的所有条目。
  • [ -f "$entry" ]判断是否为文件,确保只输出文件路径。

方法3:自定义递归函数(适合复杂逻辑)

如果之后你需要在遍历过程中加一些自定义逻辑,写个递归函数会更灵活:

# 定义递归函数,参数是要遍历的目录
list_files() {
    local target_dir="$1"
    # 遍历当前目录下的所有条目
    for entry in "$target_dir"/*
    do
        if [ -d "$entry" ]; then
            # 如果是目录,递归调用函数继续遍历
            list_files "$entry"
        elif [ -f "$entry" ]; then
            # 如果是文件,输出路径
            echo "$entry"
        fi
    done
}

# 读取用户输入的主目录
read filename
# 调用递归函数开始遍历
list_files "$filename"

这个函数会自动钻进每个子目录,直到把所有文件都找出来,后续你可以在判断里加更多操作(比如文件大小过滤、权限检查等)。

内容的提问来源于stack exchange,提问作者Ali Qumail

火山引擎 最新活动