请求修正查找目录中*.txt文件的Shell脚本
脚本修正方案
原脚本存在多处关键问题,以下是问题分析及修正后的版本:
问题梳理
- 变量赋值错误:
extension = .txt中赋值符号=两侧不能有空格,Shell会将extension识别为命令,直接导致脚本报错。 - 路径拼接逻辑错误:
for file in /tmp/test12072022/*循环里,$file已经是完整文件路径(比如/tmp/test12072022/doc),后续拼接/tmp/test12072022/$file$extension会生成重复路径(比如/tmp/test12072022//tmp/test12072022/doc.txt),完全不符合预期。 - 需求匹配偏差:原脚本是遍历目录下所有文件,再检查每个文件对应的
.txt后缀文件是否存在,而非直接检测目标目录中是否有.txt文件。
修正后的脚本(直接检测目录中是否存在txt文件)
#!/bin/bash target_dir="/tmp/test12072022" # 先检查目标目录是否存在 if [ ! -d "$target_dir" ]; then echo "目标目录不存在" exit 1 fi # 启用nullglob选项:当通配符无匹配时返回空,避免输出"*.txt"字符串本身 shopt -s nullglob txt_files=("$target_dir"/*.txt) if [ ${#txt_files[@]} -gt 0 ]; then echo "目录中存在.txt文件:" for file in "${txt_files[@]}"; do echo " - $file" done else echo "目录中不存在.txt文件" fi
简化遍历版(逐个判断文件是否为txt格式)
如果需要遍历目录并逐个验证文件类型,可使用此版本:
#!/bin/bash target_dir="/tmp/test12072022" if [ ! -d "$target_dir" ]; then echo "目标目录不存在" exit 1 fi echo "目录下的.txt文件:" for file in "$target_dir"/*.txt; do # 处理无匹配文件的情况 if [ -e "$file" ]; then echo " - $file" else echo "未找到.txt文件" fi break # 只需确认存在性,找到第一个匹配项即可退出循环 done
内容的提问来源于stack exchange,提问作者Telli
相关产品推荐
相关产品推荐

