使用变量路径删除旧文件:脚本无法读取路径文件求助
解决Shell脚本无法读取pathfile中路径的问题
让我帮你排查这个问题——你的脚本核心问题是没有正确读取pathfile文件里的内容,原脚本里的path=$pathfile这行完全没有起到读取文件的作用,只是把变量path赋值成了字符串pathfile(如果pathfile变量没定义的话,path还会是空值),自然找不到你要处理的目标路径。
下面是针对你的场景的修正方案,分两种情况适配你的pathfile格式:
方案1:适配单行空格分隔的路径(你的当前pathfile格式)
你的pathfile是单行、多个路径用空格分隔的格式,我们可以直接读取文件内容并分割成路径数组,然后遍历每个路径执行操作:
#!/bin/bash START_TIME=$(date +%s) timestamp=$(date +%Y%m%d_%H%M%S) filename=logFile_$timestamp.txt # 把日志路径存成变量,避免重复书写 log_path="/root/$filename" # 读取pathfile中的空格分隔路径,存入数组 paths=($(cat pathfile)) # 写入脚本启动日志 echo "Backup:: Script Start -- $(date +%Y%m%d_%H%M)" >> "$log_path" # 遍历每个路径执行find操作 for path in "${paths[@]}"; do # 跳过空值(如果pathfile里有多余空格的话) [[ -z "$path" ]] && continue echo "Processing path: $path" >> "$log_path" # 原脚本只是打印符合条件的文件,要删除的话把-print改成-delete,或者保留-print同时加-delete find "$path" -name "*.txt" -type f -mtime +10 -print >> "$log_path" done END_TIME=$(date +%s) # 用$((...))替代expr,更符合现代bash写法 ELAPSED_TIME=$((END_TIME - START_TIME)) echo "Backup :: Script End -- $(date +%Y%m%d_%H%M)" >> "$log_path" echo "Elapsed Time :: $(date -d 00:00:$ELAPSED_TIME +%Hh:%Mm:%Ss)" >> "$log_path"
方案2:更健壮的逐行读取(推荐,适配路径含空格的场景)
如果未来你的路径可能包含空格(比如/root/my docs/dir),单行空格分隔的格式会出问题,推荐把pathfile改成每行一个路径的格式:
/root/abc/dir1 /root/xyz/dir2 /etc/var/dir3
然后用while read循环逐行读取,这样能完美处理含空格的路径,还能跳过空行和注释:
#!/bin/bash START_TIME=$(date +%s) timestamp=$(date +%Y%m%d_%H%M%S) filename=logFile_$timestamp.txt log_path="/root/$filename" echo "Backup:: Script Start -- $(date +%Y%m%d_%H%M)" >> "$log_path" # 逐行读取pathfile,IFS=避免截断开头空格,-r避免转义字符被解析 while IFS= read -r path; do # 跳过空行和以#开头的注释行 [[ -z "$path" || "$path" =~ ^# ]] && continue echo "Processing path: $path" >> "$log_path" # 要删除文件的话,替换成:find "$path" -name "*.txt" -type f -mtime +10 -print -delete find "$path" -name "*.txt" -type f -mtime +10 -print >> "$log_path" done < pathfile END_TIME=$(date +%s) ELAPSED_TIME=$((END_TIME - START_TIME)) echo "Backup :: Script End -- $(date +%Y%m%d_%H%M)" >> "$log_path" echo "Elapsed Time :: $(date -d 00:00:$ELAPSED_TIME +%Hh:%Mm:%Ss)" >> "$log_path"
关键修改点说明
- 移除无效的
path=$pathfile:换成了真正读取pathfile文件内容的逻辑 - 变量引用加双引号:比如
"$path",避免路径含空格时被错误分割 - 日志路径统一变量:减少重复代码,更易维护
- 增加健壮性处理:跳过空行、注释行,避免无效路径导致的错误
- 现代bash语法:用
$((END_TIME - START_TIME))替代expr,更高效简洁
最后提醒
如果要实际删除旧文件,把find命令里的-print替换成-delete即可;如果想同时记录被删除的文件,写成-print -delete(先打印到日志,再删除)。
内容的提问来源于stack exchange,提问作者Jarno
相关产品推荐
相关产品推荐

