如何编写bash脚本监听/Downloads新下载文件自动生成哈希并提交API
监听Downloads目录下载完成事件的Bash脚本实现方案
核心逻辑说明
你之前仅监听inotify的新建事件无法生效,是因为主流浏览器的下载逻辑为:
- 先创建
.crdownload/.part后缀的临时文件 - 持续向临时文件写入下载内容
- 全部写入完成后,重命名为最终的目标文件名
因此需要监听文件写入完成后关闭和文件移入目录两个事件,即可准确捕获下载完成的时机。
依赖安装
首先安装inotify-tools工具包:
# Debian/Ubuntu 系列 sudo apt install inotify-tools # RHEL/CentOS/Fedora 系列 sudo dnf install inotify-tools
完整脚本示例
#!/bin/bash # 监听的下载目录 MONITOR_DIR="/Downloads" # 你的API接口地址 API_URL="http://your-api-endpoint/upload-hash" # 排除浏览器下载过程中的临时文件后缀 EXCLUDE_SUFFIX="(\.crdownload|\.part|\.tmp|\.partial)$" inotifywait -m -q -e close_write,moved_to --exclude "$EXCLUDE_SUFFIX" "$MONITOR_DIR" | while read -r directory events filename; do # 拼接完整文件路径 FILE_PATH="${directory}${filename}" # 跳过目录,仅处理普通文件 if [ -f "$FILE_PATH" ]; then # 生成SHA256哈希值,也可替换为md5/sha1等 FILE_HASH=$(sha256sum "$FILE_PATH" | awk '{print $1}') # 发送哈希到API,此处为POST表单示例,可根据API要求调整参数格式 curl -s -X POST "$API_URL" \ -d "filename=${filename}" \ -d "sha256=${FILE_HASH}" \ -d "file_path=${FILE_PATH}" # 可自行添加执行成功/失败的日志逻辑 echo "$(date '+%Y-%m-%d %H:%M:%S') 处理完成:${FILE_PATH},哈希值:${FILE_HASH}" >> /var/log/download_monitor.log fi done
使用说明
- 将上述脚本保存为
download_monitor.sh - 赋予执行权限:
chmod +x download_monitor.sh - 测试运行无异常后,可配置为systemd服务实现开机自启动
可选优化点
- 可添加请求失败重试逻辑,避免API接口临时不可用导致上报失败
- 如需处理特殊格式的下载文件,可自行调整临时文件排除规则
- 可添加哈希计算失败、文件不存在等异常场景的容错处理
内容的提问来源于stack exchange,提问作者hohenheim
相关产品推荐
相关产品推荐

