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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:51:59