如何在Bash脚本中将目录与对应文件按行分组以便分词
解决Bash中目录与对应文件分组显示的问题
我明白你想要的效果:每个子目录单独占一行,目录名后跟冒号和该目录下的所有文件列表,彻底解决默认ls命令的换行混乱、格式不规整的问题。下面给你几种实用的解决方案:
方法1:Bash循环遍历(最直观易读)
这是最容易理解和自定义的方式,适合新手或者需要调整逻辑的场景:
#!/bin/bash TARGET_DIR="/home/maindir" # 遍历目标目录下的所有子目录(末尾加/确保只匹配目录,排除普通文件) for dir in "$TARGET_DIR"/*/; do # 移除目录路径末尾的斜杠,让输出更整洁 dir_name="${dir%/}" # 先打印目录名加冒号,不换行 echo -n "$dir_name: " # 列出目录下所有文件(每行一个),再把换行换成空格,最后补换行 ls -1q "$dir" | tr '\n' ' ' echo done
关键细节说明:
"$TARGET_DIR"/*/:末尾的/是核心,它会让Shell只匹配目录,不会把目标目录下的普通文件纳入遍历范围。${dir%/}:Bash参数扩展语法,用来移除变量末尾的斜杠,避免输出变成home/maindir/dir1/: ...的冗余格式。ls -1q:-1强制每行显示一个文件,-q用?替代不可打印字符,避免乱码干扰输出。tr '\n' ' ':把ls输出的换行符替换成空格,让所有文件整齐排在同一行。
方法2:一行式find命令(快速执行)
如果想快速用一行命令实现需求,可以用find配合Shell命令:
find /home/maindir -maxdepth 1 -type d ! -name maindir -exec sh -c 'echo -n "$1: "; ls -1q "$1" | tr "\n" " "; echo' sh {} \;
解释:
-maxdepth 1:限制只查找目标目录的直接子目录,不深入下层嵌套目录。-type d:只匹配目录类型的条目。! -name maindir:排除目标目录本身,只处理它的子目录。-exec sh -c '...' sh {} \;:对每个找到的目录执行后面的Shell脚本,{}会被自动替换为当前目录的完整路径。
方法3:过滤空目录(可选优化)
如果你不想显示没有文件的空目录,可以在循环里加一个判断逻辑:
#!/bin/bash TARGET_DIR="/home/maindir" for dir in "$TARGET_DIR"/*/; do dir_name="${dir%/}" # 检查目录是否非空(包含文件或隐藏文件) if [ -n "$(ls -A "$dir")" ]; then echo -n "$dir_name: " ls -1q "$dir" | tr '\n' ' ' echo fi done
解释:
ls -A "$dir":列出目录下所有文件(包括隐藏文件,但不包含.和..),空目录会返回空输出。[ -n "$(...)" ]:判断命令输出是否非空,只有非空时才执行打印逻辑,自动跳过空目录。
这样就能完美得到你想要的规整输出格式啦!
内容的提问来源于stack exchange,提问作者blob
相关产品推荐
相关产品推荐

