shell 实现高效的单层文件路径匹配方法说明
正确方式:通过通配符进行路径扩展,实现文件名的匹配
例如:匹配 /home/ehigh/work 目录下一层的所有子目录
*/这个写法就是“只匹配目录”
#!/bin/bash
for dir_name in /home/ehigh/work/*/ ;doecho "$dir_name"
done
例如:匹配当前路径下所有以 .tar.gz 结尾的文件
这个写法只会匹配当前目录下一层的
.tar.gz文件,不会递归子目录。
#!/bin/bashfor file_name in *.tar.gz ; doecho "$file_name"
done
错误方式:捕获 echo 或 ls 这种命令的输出,然后再对输出进行处理
例如:
#!/bin/bashfor dir_name in $(ls -d /home/ehieh/work/*/) ;doecho "$dir_name"
done
存在的问题:
- 依赖
ls输出不可靠,文件名里有特殊字符时会出问题。 - 未加引号的
$()会触发 IFS 分词,但是如果给$()外面再加双引号,就只会变成一个参数
