Bash脚本检查文件存在功能失效问题求助
我来帮你拆解下问题,顺便给几个实用的解决方案~
首先先澄清你用到的几个判断参数的区别,搞懂它们才能选对合适的条件:
-e:检查任意类型的文件/目录/链接是否存在(只要路径能找到就返回真)-f:严格检查是否是普通文件(排除目录、软链接等特殊类型)-s:检查是否是存在且非空的普通文件(文件大小大于0)
先看你当前代码的语法问题
你把变量赋值和if写在了同一行却没加分隔符,这会导致bash解析错误!正确的写法应该是:
# 要么用分号分隔 FileName="$WORKDIR/.../name_of_the_file.tif"; if [ ! -e "${FileName}" ]; then ... fi # 更推荐分开写,可读性更强 FileName="$WORKDIR/.../name_of_the_file.tif" if [ ! -e "${FileName}" ]; then # 你的处理逻辑 fi
另外注意:变量赋值时=两边不能有空格,路径要用双引号括起来,避免文件名含空格或特殊字符时出错。
针对「只处理新TIFF文件」的解决方案
如果你的脚本是批量处理目录下的TIFF(而不是单个固定文件),那单靠判断单个文件存在性肯定不够,这里给三种常用思路:
方案1:用标记文件记录已处理文件
处理完一个TIFF后,生成一个同名的标记文件,下次运行时检查标记文件是否存在,存在就跳过:
# 遍历目标目录下所有TIFF文件 for tiff_file in "$WORKDIR"/.../*.tif; do # 生成对应标记文件的路径 marker_file="${tiff_file}.processed" # 如果标记文件不存在,说明未处理过 if [ ! -f "$marker_file" ]; then echo "正在处理:$tiff_file" # 这里写你的TIFF处理逻辑,比如转换、分析等 # 处理完成后创建标记文件 touch "$marker_file" else echo "跳过已处理文件:$tiff_file" fi done
方案2:通过文件修改时间筛选新文件
记录上次脚本运行的时间,只处理比这个时间更新的文件,不需要额外标记:
# 存储上次运行时间戳的文件 timestamp_file="$WORKDIR/.last_process_time" # 获取上次运行时间(文件不存在则用0) last_run=$(cat "$timestamp_file" 2>/dev/null || echo 0) # 获取当前时间戳 current_run=$(date +%s) # 遍历TIFF文件 for tiff_file in "$WORKDIR"/.../*.tif; do # 获取文件的修改时间戳 file_mtime=$(stat -c %Y "$tiff_file") # 如果文件修改时间晚于上次运行时间,就处理 if [ "$file_mtime" -gt "$last_run" ]; then echo "处理新文件:$tiff_file" # 你的处理逻辑 fi done # 更新时间戳文件,方便下次运行 echo "$current_run" > "$timestamp_file"
方案3:检查处理后的输出文件是否存在
如果你的处理逻辑会生成对应输出文件(比如把TIFF转成PNG),直接检查输出文件是否存在即可:
for tiff_file in "$WORKDIR"/.../*.tif; do # 假设处理后生成同名PNG文件 output_file="${tiff_file%.tif}.png" if [ ! -f "$output_file" ]; then echo "处理$tiff_file -> $output_file" # 这里写转换逻辑,比如 convert "$tiff_file" "$output_file" fi done
额外注意事项
- 所有变量引用都用双引号括起来,避免文件名含空格、特殊字符时出错
- 可以先用
echo "$FileName"打印变量值,确认路径是否正确(很多时候问题出在路径拼接错误) - 如果是单个固定文件的场景,先检查变量赋值后的路径是否真的不存在,可能你判断的文件其实已经被生成了
内容的提问来源于stack exchange,提问作者Dr. E
相关产品推荐
相关产品推荐

