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 分词,但是如果给$()外面再加双引号,就只会变成一个参数
浙公网安备 33010602011771号