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




