如何在循环中利用ls命令结果判断各条目是否为目录
嘿,我懂你想要实现的效果——遍历ls输出的每一行,逐个判断对应的条目是不是目录对吧?不过先给你提个小建议:直接解析ls的输出其实不是最佳实践,因为文件名里如果包含空格、换行或者特殊字符,很容易触发脚本的bug。不过还是按照你的需求,给你两种可行的方案,其中一种更稳妥,推荐优先使用~
方案1:基于
ls输出的循环(满足你的原始需求) 如果你一定要用ls的输出来做循环,这个脚本可以实现你的要求:
#!/bin/bash # 读取ls的每一行输出,用-r参数保留原始字符避免转义问题 ls | while read -r entry; do # 用-d选项判断当前条目是否为目录,变量加双引号处理带空格的文件名 if [ -d "$entry" ]; then echo "$entry is directory" fi done
这里的read -r是关键,它能防止文件名里的反斜杠被错误转义;给$entry加上双引号则是为了避免脚本把带空格的文件名拆成多个参数,导致判断出错。
方案2:更安全的遍历方式(强烈推荐)
直接用shell的通配符(glob)来遍历目录条目,完全不需要依赖ls的输出,能完美处理各种特殊文件名,是业内推荐的写法:
#!/bin/bash # 遍历当前目录下的所有条目(包括隐藏文件) for entry in * .*; do # 跳过当前目录(.)和上级目录(..)这两个特殊条目 if [[ "$entry" == "." || "$entry" == ".." ]]; then continue fi # 判断是否为目录 if [ -d "$entry" ]; then echo "$entry is directory" fi done
如果不需要处理隐藏文件,直接把循环改成for entry in *; do ...就可以了,代码会更简洁。
内容的提问来源于stack exchange,提问作者Yusuf Mu'min
相关产品推荐
相关产品推荐

