You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用变量路径删除旧文件:脚本无法读取路径文件求助

解决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"

关键修改点说明

  1. 移除无效的path=$pathfile:换成了真正读取pathfile文件内容的逻辑
  2. 变量引用加双引号:比如"$path",避免路径含空格时被错误分割
  3. 日志路径统一变量:减少重复代码,更易维护
  4. 增加健壮性处理:跳过空行、注释行,避免无效路径导致的错误
  5. 现代bash语法:用$((END_TIME - START_TIME))替代expr,更高效简洁

最后提醒

如果要实际删除旧文件,把find命令里的-print替换成-delete即可;如果想同时记录被删除的文件,写成-print -delete(先打印到日志,再删除)。

内容的提问来源于stack exchange,提问作者Jarno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:52:25