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
相关产品推荐
相关产品推荐

