【问题标题】:Comparing checksums from a directory and checksums from a store.txt file line by line to see if changes were made逐行比较目录中的校验和和 store.txt 文件中的校验和,以查看是否进行了更改
【发布时间】:2015-07-25 08:27:27
【问题描述】:

我的 bash 脚本遇到问题,我需要比较 /axa/backup/ 目录中备份文件的校验和和存储校验和的 store.txt 文件,以确保没有已经进行了更改。我需要使用 for 循环和 if-else 循环,但它似乎不起作用,因为我很少使用它。

这是我编写的 bash 脚本:

#!/bin/bash
for md5sum in /sads/backup/*.tgz
do
  if [ "md5sum" = cat store.txt ]
  then 
     echo "no changes made in /sads/backup/*.tgz "
  else
     echo "Changes made in /sads/backup/*.tgz "
  fi
done

【问题讨论】:

    标签: bash loops for-loop


    【解决方案1】:

    生成所有文件的 MD5 校验和:

    find /sads/backup -type f -name '*.tgz' -exec md5sum {} + > checksums.txt
    

    验证所有文件是否匹配它们的校验和:

    if md5sum --check --status checksums.txt
    then
        echo "No changes"
    else
        echo "Changed files"
    fi
    

    几点说明:

    • 如果checksums.txt 中的某个文件丢失,md5sum 失败,但如果添加了不在checksums.txt 中的新文件,则不会失败。
    • 如果您想查看每个文件的状态,请删除 --status

      md5sum --check checksums.txt | grep --invert-match ': OK$'
      
    • 如果您需要检查可能被其他人恶意更改的文件(不仅仅是您意外更改),您希望使用更安全的散列算法。只需将md5sum 替换为例如sha256sum
    • 上述命令 do 处理奇怪命名的文件:

      $ cd -- "$(mktemp --directory)"
      $ echo a > files/a
      $ echo $'a\nz' > $'files/a\nz'
      $ echo z > files/z
      $ find files -mindepth 1 -exec md5sum {} + > checksums.txt
      $ md5sum --check checksums.txt
      files/z: OK
      files/a
      z: OK
      files/a: OK
      $ echo fail > $'files/a\nz'
      $ md5sum --check checksums.txt
      files/z: OK
      files/a
      z: FAILED
      files/a: OK
      md5sum: WARNING: 1 computed checksum did NOT match
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 2015-06-07
      相关资源
      最近更新 更多