shell 中遍历某个目录下所有子目录的两种方法(通配符路径扩展 和 ls 命令替换)对比

正确方式:通过通配符进行路径扩展,实现文件名的匹配

例如:匹配 /home/ehigh/work 目录下一层的所有子目录

*/ 这个写法就是“只匹配目录”

#!/bin/bash
for dir_name in /home/ehigh/work/*/ ;do
    echo "$dir_name"
done

例如:匹配当前路径下所有以 .tar.gz 结尾的文件

这个写法只会匹配当前目录下一层的 .tar.gz 文件,不会递归子目录。

#!/bin/bash

for file_name in *.tar.gz ; do
    echo "$file_name"
done

错误方式:捕获 echo 或 ls 这种命令的输出,然后再对输出进行处理

例如:

#!/bin/bash

for dir_name in $(ls -d /home/ehieh/work/*/) ;do
    echo "$dir_name"
done

存在的问题

  • 依赖 ls 输出不可靠,文件名里有特殊字符时会出问题。
  • 未加引号的 $() 会触发 IFS 分词,但是如果给 $() 外面再加双引号,就只会变成一个参数

posted on 2025-12-03 14:29  一直小爪子  阅读(27)  评论(0)    收藏  举报