我的创作纪念日——sheel自动化脚本

发布于:2024-10-09 ⋅ 阅读:(9) ⋅ 点赞:(0)

注册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命令来检查文件是否存在。如果文件不存在,该命令会返回非零状态码,!操作符会将其转换为真,从而触发上传操作。如果文件已经存在,则不进行上传,并记录相应的日志信息。

通过这一改进,脚本能够更智能地处理文件上传,避免了不必要的重复上传,提高了效率和用户体验。


继续加油!未来更好!🚀🚀🚀

在这里插入图片描述


都看到这了,点个关注吧!!!😎😎😎


网站公告

今日签到

点亮在社区的每一天
去签到