如何将Bash提取的唯一NoData值转为变量并分类TIF文件?
按NoData值分类TIF文件的Bash脚本解决方案
我来帮你搞定这个按NoData值分类TIF文件的需求!先看看你原脚本里的几个小问题,再给你一个完整的可运行方案:
原脚本的几个小问题
dir=(ls -1 type -f)语法错误,应该用命令替换$(...),而且type -f是多余的,我们直接遍历目标目录的TIF文件即可cd $dir逻辑不对,应该切换到你定义的basepath目录- 提取NoData值时保留了"NoData Value="前缀,不利于后续作为文件夹名或变量使用
完整实现脚本
下面的脚本会自动提取所有唯一的NoData值(包括无NoData的文件,标记为None),创建对应文件夹,并把TIF文件分类移动进去:
# 定义目标目录,建议用绝对路径避免相对路径问题,比如~/Desktop/DEM basepath=~/Desktop/DEM # 先检查目录是否存在,不存在则报错退出 if [ ! -d "$basepath" ]; then echo "错误:目标目录 $basepath 不存在,请检查路径!" exit 1 fi # 切换到目标目录 cd "$basepath" # 第一步:提取所有文件的NoData值,保存到临时文件(避免重复调用gdalinfo提升效率) temp_file=$(mktemp) for tif_file in *.tif; do # 提取NoData值,只保留数值部分;如果没有则输出"None" nodata_value=$(gdalinfo "$tif_file" | grep -o 'NoData Value\=[-0-9]*' | sed 's/NoData Value\=//') echo "${nodata_value:-None}" >> "$temp_file" done # 获取唯一的NoData值列表,存到数组中 unique_nodatas=($(sort "$temp_file" | uniq)) # 第二步:为每个唯一的NoData值创建对应的文件夹 for nodata in "${unique_nodatas[@]}"; do # 文件夹名用"nodata_值"的格式,比如nodata_-9999、nodata_None folder_name="nodata_${nodata//=/}" # -p参数确保文件夹不存在时创建,已存在则不报错 mkdir -p "$folder_name" done # 第三步:遍历所有TIF文件,移动到对应的文件夹 for tif_file in *.tif; do # 提取当前文件的NoData值 current_nodata=$(gdalinfo "$tif_file" | grep -o 'NoData Value\=[-0-9]*' | sed 's/NoData Value\=//') # 处理无NoData的情况 current_nodata=${current_nodata:-None} # 确定目标文件夹 target_folder="nodata_${current_nodata//=/}" # 移动文件 mv "$tif_file" "$target_folder/" done # 清理临时文件 rm "$temp_file" echo "分类完成!已创建以下文件夹并完成文件移动:" ls -d nodata_*
关键细节说明
- 路径处理:用绝对路径定义
basepath,避免切换目录时出现相对路径错误;先检查目录是否存在,避免后续操作失败 - 临时文件优化:先把所有文件的NoData值提取到临时文件,避免重复调用
gdalinfo(尤其是文件很多时,能提升效率) - 无NoData处理:用
${nodata_value:-None}标记没有NoData值的文件,统一分类到nodata_None文件夹 - 文件夹创建:
mkdir -p确保文件夹能成功创建,即使已经存在也不会报错 - 变量安全:所有变量都用双引号包裹,避免文件名或路径含空格时出现错误
如果你需要对特定NoData值(比如你定义的rightnodata=-9999)做特殊处理,可以在移动文件的步骤里加个判断,比如:
rightnodata=-9999 if [ "$current_nodata" = "$rightnodata" ]; then mv "$tif_file" "target_special_folder/" else mv "$tif_file" "$target_folder/" fi
内容的提问来源于stack exchange,提问作者Rose
相关产品推荐
相关产品推荐

