注册csdn的1024天,今天就分享一个脚本吧。😁
引言
在之前的文章自动化文件管理:Ubuntu中的文件监控与上传脚本指南中,小编介绍了一个自动上传文件的脚本。然而,在今天的使用过程中,我们发现了一些问题需要改进:
- 无法查看上传了哪些文件
- 当监控目录存在文件时,一开始不会上传
改进
为了提升脚本的功能和用户体验,我们对脚本进行了以下改进:
- 记录上传的文件
为了方便用户查看哪些文件已经被上传,我们在脚本中增加了日志记录功能。每次上传文件时,都会将相关信息记录到日志文件中。 - 初始文件上传
为了让脚本在启动时能够上传监控目录中已存在的文件,我们在脚本中增加了一个初始上传步骤。 - 避免重复上传
在测试过程中,我们发现了一个新的问题:如果百度网盘中已经存在某个文件,脚本依然会尝试上传该文件。为了避免这种情况,我们在upload_files函数中增加了对百度网盘中文件存在的检查。如果文件已经存在,则不会进行上传。
脚本逻辑说明
1.定义要监控的本地目录和百度网盘的目标目录:
WATCHED_DIR:要监控的本地目录,设置为./results。
BAIDU_YUN_DIR:百度网盘的目标目录,设置为Adversarial_camou/results5。
LOG_FILE:日志文件的路径,设置为uploadLog.txt。
2.确保日志文件存在:
使用touch命令确保日志文件存在。如果文件不存在,touch会创建一个空文件。
3.定义一个上传文件的函数:
upload_files函数会查找目录中的所有文件(包括子目录中的文件),并上传到百度网盘。
每次上传文件时,都会将相关信息记录到日志文件中。
在上传文件前,检查百度网盘中是否已经存在该文件,如果存在则不进行上传。
4.立即上传监控目录中已存在的文件:
脚本启动时调用upload_files函数,立即将监控目录中已存在的文件上传到百度网盘。
5.持续监控监控目录中的文件变化:
使用inotifywait命令持续监控监控目录中的文件变化(包括修改、移动、创建、删除)。
当检测到文件变化时,读取变化的文件路径并上传到百度网盘。
源码:
WATCHED_DIR="./results"
BAIDU_YUN_DIR="Adversarial_camou/results5"
LOG_FILE="uploadLog.txt"
touch "$LOG_FILE"
upload_files() {
local DIR=$1
# 查找目录中的所有文件,包括子目录中的文件
find "$DIR" -type f | while read FILE; do
echo "Found existing file: $FILE" >> "$LOG_FILE"
# 构建百度云中的完整路径
# 去除本地路径的开头部分,保留相对路径
LOCAL_RELATIVE_PATH="${FILE#$DIR/}"
# 构建百度云中的完整路径
CLOUD_PATH="${BAIDU_YUN_DIR}/$LOCAL_RELATIVE_PATH"
# 使用bypy上传文件到百度云指定目录
bypy upload "$FILE" "$CLOUD_PATH"
echo "Uploaded $FILE to Baidu Yun directory: $CLOUD_PATH" >> "$LOG_FILE"
done
}
# 立即上传监控文件夹中现有的文件
upload_files "$WATCHED_DIR"
# 监控文件更改
inotifywait -m -r -e modify,move,create,delete --format '%w%f' "$WATCHED_DIR" | while read FILE
do
echo "Detected change in $FILE" >> "$LOG_FILE"
# 构建百度云中的完整路径
# 去除本地路径的开头部分,保留相对路径
LOCAL_RELATIVE_PATH="${FILE#$WATCHED_DIR/}"
# 构建百度云中的完整路径
CLOUD_PATH="${BAIDU_YUN_DIR}/$LOCAL_RELATIVE_PATH"
# 使用bypy上传文件到百度云指定目录
bypy upload "$FILE" "$CLOUD_PATH"
echo "Uploaded $FILE to Baidu Yun directory: $CLOUD_PATH" >> "$LOG_FILE"
done
在上述代码的测试过程中,小编发现了一个新的问题:如果百度网盘中已经存在某个文件A,脚本仍然会尝试上传该文件A。然而,在upload_files函数中,我们的初衷是避免上传已存在的文件,因此这种行为导致了矛盾。
为了解决这个问题,小编对upload_files函数进行了改进:在上传文件之前,先检查百度网盘中是否已经存在该文件。如果文件不存在,则进行上传;如果文件已经存在,则不进行上传。修改后的函数如下:
upload_files() {
local DIR=$1
# 查找目录中的所有文件,包括子目录中的文件
find "$DIR" -type f | while read FILE; do
echo "Found existing file: $FILE" >> "$LOG_FILE"
# 构建百度云中的完整路径
# 去除本地路径的开头部分,保留相对路径
LOCAL_RELATIVE_PATH="${FILE#$DIR/}"
# 构建百度云中的完整路径
CLOUD_PATH="${BAIDU_YUN_DIR}/$LOCAL_RELATIVE_PATH"
# 检查百度网盘中是否已经存在该文件
if ! bypy list "$CLOUD_PATH" &> /dev/null; then
# 使用bypy上传文件到百度云指定目录
bypy upload "$FILE" "$CLOUD_PATH"
echo "Uploaded $FILE to Baidu Yun directory: $CLOUD_PATH" >> "$LOG_FILE"
else
echo "File already exists in Baidu Yun: $CLOUD_PATH" >> "$LOG_FILE"
fi
done
}
比较
在upload_files函数和文件变化监控部分,我们增加了对百度网盘中文件存在的检查。
具体来说,我们使用了bypy list “$CLOUD_PATH” &> /dev/null命令来检查文件是否存在。如果文件不存在,该命令会返回非零状态码,!操作符会将其转换为真,从而触发上传操作。如果文件已经存在,则不进行上传,并记录相应的日志信息。
通过这一改进,脚本能够更智能地处理文件上传,避免了不必要的重复上传,提高了效率和用户体验。
继续加油!未来更好!🚀🚀🚀
都看到这了,点个关注吧!!!😎😎😎