Shell脚本实现一键快速搞定系统集成异常文件(附全部源码)

作者:

文章目录
  • 最近在和别的系统做数据集成的时候,遇到异常截断或同步错误的情况。 pdf,doc,txt等附件在Linux服务器 /data/fileFtp 目录,发现大量文件大小为 10KB,或者更小的的文件。这往往不是巧合,而是集成系统推过来的数据有问题,给过来的数据看着是“xxxx.pdf”,而文件大小只有几KB,并且这个文件打开提示文件是损坏的!! 为了从数千个文件中快速锁定这些“害群之马”文件,我写了一个自动化脚本。
  • 这个脚本,能够满足以下三个条件: 自定扫描:递归检查指定目录。 多维信息展示:除了路径,还看文件大小和最后修改时间。 标记异常:在结果中直观地标记出疑似 10KB 的问题文件。 离线查阅:结果输出到文件,方便下载到本地或后续审计。
  • 下面是编写了的为 check_files.sh 的脚本。 #!/bin/bash # 配置要扫描的根目录 TARGET_DIR=”/data/fileFtp” # 定义输出结果文件,加入时间戳防止覆盖 LOG_FILE=”check_results_$(date +%Y%m%d).log” echo “开始扫描: $TARGET_DIR …” { echo “==========================================================================” echo ” 扫描报告 | 目录: $TARGET_DIR | 生成时间: $(date ‘+%Y-%m-%d %H:%M:%S’)” echo “==========================================================================” printf “%-12s | %-12s | %-20s | %sn” “扫描检查结果” “大小” “修改时间” “路径” echo “————————————————————————–” # 使用 find 寻找所有文件 find “$TARGET_DIR” -type f | while read -r file; do # 获取字节大小 size_bytes=$(stat -c%s “$file”) # 获取人类直观大小 (如 10K) size_human=$(ls -lh “$file” | awk ‘{print $5}’) # 获取修改时间 (yyyy-mm-dd hh:mm:ss) mtime=$(stat -c%y “$file” | cut -d’.’ -f1) # 逻辑判断:如果文件在 9k-10k 之间 (Linux find 逻辑) if [ “$size_bytes” -ge 9216 ] && [ “$size_bytes” -le 10240 ]; then status=”[ ISSUE ]” else status=”[ OK ]” fi printf “%-12s | %-12s | %-20s | %sn” “$status” “$size_human” “$mtime” “$file” done } > “$LOG_FILE” echo “扫描完成!报告已生成: $LOG_FILE”
  • 创建脚本文件: vi check_files.sh (将上面的代码粘贴进去并保存退出)。 赋予执行权限: chmod +x check_files.sh 运行脚本: ./check_files.sh 进行查看结果: cat check_results_20260210.log 只查看异常文件: grep ‘ISSUE’ check_results_20260210.log 统计异常数量: grep -c ‘ISSUE’ check_results_20260210.log
  • 目录
    • 1. 背景描述
    • 2. 这个脚本的作用
    • 3. 脚本实现:check_files.sh
    • 4.如何使用该脚本
    • 5. 关键技术点深度解析
      • A. 文件状态的判断逻辑
      • B.stat命令的高效利用
      • C. 重定向与格式化输出

    最近在和别的系统做数据集成的时候,遇到异常截断同步错误的情况。 pdf,doc,txt等附件在Linux服务器 /data/fileFtp 目录,发现大量文件大小为 10KB,或者更小的的文件。这往往不是巧合,而是集成系统推过来的数据有问题,给过来的数据看着是“xxxx.pdf”,而文件大小只有几KB,并且这个文件打开提示文件是损坏的!!

    为了从数千个文件中快速锁定这些“害群之马”文件,我写了一个自动化脚本。

    这个脚本,能够满足以下三个条件:

    • 自定扫描:递归检查指定目录。
    • 多维信息展示:除了路径,还看文件大小和最后修改时间。
    • 标记异常:在结果中直观地标记出疑似 10KB 的问题文件。
    • 离线查阅:结果输出到文件,方便下载到本地或后续审计。

    下面是编写了的为 check_files.sh 的脚本。

    #!/bin/bash
    
    # 配置要扫描的根目录
    TARGET_DIR="/data/fileFtp"
    # 定义输出结果文件,加入时间戳防止覆盖
    LOG_FILE="check_results_$(date +%Y%m%d).log"
    
    echo "开始扫描: $TARGET_DIR ..."
    
    {
        echo "=========================================================================="
        echo " 扫描报告 | 目录: $TARGET_DIR | 生成时间: $(date '+%Y-%m-%d %H:%M:%S')"
        echo "=========================================================================="
        printf "%-12s | %-12s | %-20s | %sn" "扫描检查结果" "大小" "修改时间" "路径"
        echo "--------------------------------------------------------------------------"
    
        # 使用 find 寻找所有文件
        find "$TARGET_DIR" -type f | while read -r file; do
            # 获取字节大小
            size_bytes=$(stat -c%s "$file")
            # 获取人类直观大小 (如 10K)
            size_human=$(ls -lh "$file" | awk '{print $5}')
            # 获取修改时间 (yyyy-mm-dd hh:mm:ss)
            mtime=$(stat -c%y "$file" | cut -d'.' -f1)
            
            # 逻辑判断:如果文件在 9k-10k 之间 (Linux find 逻辑)
            if [ "$size_bytes" -ge 9216 ] && [ "$size_bytes" -le 10240 ]; then
                status="[ ISSUE ]"
            else
                status="[  OK   ]"
            fi
    
            printf "%-12s | %-12s | %-20s | %sn" "$status" "$size_human" "$mtime" "$file"
        done
    } > "$LOG_FILE"
    
    echo "扫描完成!报告已生成: $LOG_FILE"
    
    

    创建脚本文件:

    vi check_files.sh (将上面的代码粘贴进去并保存退出)。
    

    赋予执行权限:

     chmod +x check_files.sh
    

    运行脚本:

    ./check_files.sh
    

    进行查看结果:

    cat   check_results_20260210.log   
    

    只查看异常文件:

    grep 'ISSUE' check_results_20260210.log
    

    统计异常数量:

    grep -c 'ISSUE' check_results_20260210.log
    

    在脚本中,我们使用了字节区间判断:

    if [ "$size_bytes" -ge 9216 ] && [ "$size_bytes" -le 10240 ];
    

    这是因为在 Linux 中,find -size 10k 实际上匹配的是 9KB 到 10KB 之间的数据。通过手动设定字节范围,我们可以更精确地控制“可疑”的定义。

    相比于 ls 命令,stat 是专门用来获取文件元数据的工具。

    • stat -c%s:直接获取文件字节数,方便进行数学比较。
    • stat -c%y:获取高精度的修改时间。

    脚本最后使用了 { ... } > "$LOG_FILE"。这种写法将整个代码块的 stdout(标准输出)一次性重定向到文件中,比在每一行后面写 >> 要优雅且高效得多。

    与系统做集成的,一定要用这个脚本自己查一下,不然推过来的数据,用的时候,有问题,真的是愁死人啊! 通过这个简单的 Shell 脚本,我们将枯燥的人肉搜索转变为精准的自动化审计。

    到此这篇关于Shell脚本实现一键快速搞定系统集成异常文件(附全部源码)的文章就介绍到这了,更多相关Shell脚本清理异常文件内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • 使用Shell脚本生成配置文件的6种方法
    • Shell脚本实现环境变量与配置文件应用指南
    • PowerShell脚本进阶统计目录大小并包含隐藏文件
    • 执行shell 脚本将日志全部输出到文件的多种方法
    • Linux shell脚本对常见图片格式批量转换为PDF文件
    • 利用shell脚本进行批量处理文件后缀名

    站内搜索