如何用通配符提取目录中唯一.datt文件的文件名根名?
解决提取唯一.datt文件根名的问题
你的脚本出错是因为直接用myfile=*.datt赋值后,shell的通配符展开机制可能导致意外结果,尤其是当目录中有其他文件时,变量展开会出现混乱。下面是几种可靠的解决方法:
方法一:用数组捕获匹配文件(推荐)
利用数组存储所有匹配的.datt文件(因为你说目录里只有一个,所以数组只有一个元素),再提取根名:
# 将所有.datt文件存入数组 datt_files=(*.datt) # 取数组第一个元素(唯一的目标文件) target_file="${datt_files[0]}" # 移除.datt后缀得到根名 root_name="${target_file%.datt}" # 输出结果 echo "$root_name"
方法二:用find命令精准定位
如果需要确保只找到当前目录下的普通文件,可用find命令:
# 查找当前目录下的.datt文件,只取第一个结果 target_file=$(find . -maxdepth 1 -type f -name "*.datt" | head -n 1) # 先移除路径前缀(./),再移除后缀 root_name="${target_file##*/}" root_name="${root_name%.datt}" echo "$root_name"
方法三:简化写法(适用于确定只有一个.datt文件的场景)
# 直接通过ls和sed提取根名 root_name=$(ls *.datt | sed 's/\.datt$//') echo "$root_name"
为什么原脚本出错?
原脚本中myfile=*.datt赋值后,若后续操作未用双引号包裹变量,shell会对变量值再次执行通配符展开和分词操作,导致${myfile%.datt}处理的不是单个文件名,而是一堆混乱的文件列表,最终输出错误结果。
内容的提问来源于stack exchange,提问作者EverLearner
相关产品推荐
相关产品推荐

