You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash如何遍历子目录及子目录内文件并打印文件名

脚本错误原因

你的脚本存在3个核心问题,导致输出不符合预期:

  • 开头重复声明了两个解释器shebang,只有第一行#!/bin/bash会生效,第二行#!/bin/sh属于冗余无效内容
  • 内层循环for FILE in dir中的dir是固定字符串,既没有引用外层循环的$dir变量,也没有匹配对应目录下的文件,因此只会输出固定的dir文本
  • 输出重定向符号>写在了内层循环块位置,每次外层循环执行时都会清空覆盖之前写入的文件内容,即便循环逻辑正确,最终也只会保留最后一个目录的遍历结果
修正方案

可用脚本(按目录顺序遍历输出纯文件名)

#!/bin/bash
# 切换到目标根目录,切换失败直接退出避免逻辑异常
cd /the/root/directory || exit 1

for dir in */
do
    # 遍历当前子目录下的所有内容
    for FILE in "$dir"*
    do
        # 仅处理普通文件,跳过嵌套的子目录
        if [ -f "$FILE" ]; then
            # ${FILE##*/} 会去掉路径前缀,只保留纯文件名
            echo "${FILE##*/}"
        fi
    done
# 整个循环的输出一次性写入目标文件,不会重复覆盖
done > /the/root/directory/filenames.txt

逻辑说明

  • 外层循环*/会按文件名字典序自动排序匹配根目录下的所有子目录,天然符合你要求的dir2→dir3→dir4遍历顺序
  • 内层循环"$dir"*会匹配当前子目录下的所有条目,加-f判断是为了过滤掉子目录下嵌套的其他文件夹,只输出文件
  • 如果你需要输出带所属子目录的相对路径(比如dir2/file1格式),直接把echo "${FILE##*/}"改成echo "$FILE"即可

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 20:48:35