【问题标题】:Linux bash script for watching file changes -> how do I get changed file names用于监视文件更改的 Linux bash 脚本 -> 如何获取更改的文件名
【发布时间】:2015-08-06 02:16:09
【问题描述】:

我想编辑 Mike Mullin 的这个监视脚本:https://gist.github.com/mikesmullin/6401258 以获取更改文件的名称。它似乎只检查整个文件列表的数据完整性:

update_sha() {
sha=`ls -lR --time-style=full-iso $path | sha1sum`
}

与旧列表比较:

compare() {
  update_sha
  if [[ $sha != $previous_sha ]] ; then
    echo -n "change detected,"
    build
    previous_sha=$sha
  else
    echo -n .
  fi
}

如果我理解正确,它只会检查是否有任何更改发生,而不是检查哪个文件发生了更改。 是否还有办法获取已更改文件的个人名称?

【问题讨论】:

  • 您展示的脚本正在控制一个由“$path”标识的文件。
  • @pasabaporaqui:脚本散列ls -lr $path,因此它正在处理递归目录列表,而不是单个文件。
  • 对不起,这是真的,但是只使用和存储了一个sha sum,它们都被认为是一个数据包。
  • @pasaba:正是 OP 的动机 :-)

标签: linux bash shell watch


【解决方案1】:

我可以建议一种不同的方法吗?使用工具“inotifywait”。请参阅此链接作为参考:https://superuser.com/questions/181517/how-to-execute-a-command-whenever-a-file-changes

【讨论】:

    【解决方案2】:

    为了找出对目录树进行了哪些更改,您需要保存ls -lr 的整个输出,而不仅仅是校验和。对于多达数百万个文件的目录树,这应该不会有太大问题,但对于非常大的树,您可能需要尝试不同的方法。

    一旦您知道两个目录列表不同,您就可以使用diff 实用程序来查找差异。 Gnu diff 提供了一种非常可定制的机制来格式化 diff 报告。

    【讨论】:

      【解决方案3】:

      刚刚写了这个,我认为它可能会起作用:

      for name in $(find . -type f)
      do 
          sha1sumstr="$(sha1sum $name)"
          sha1sum_sep=($sha1sumstr)
          sha1="${sha1sum_sep[0]}"
          fp="${sha1sum_sep[1]}"
          printf "\nChecking: %s with filepath %s\n" $sha1 $fp
          checkstr="$(grep -h $sha1 ../prev_check)"
          checkarr=($checkstr)
          if [ "$checkstr" == "$sha1sumstr" ]; then
            printf "\nnochange\n"
          else
            printf "Possibly new file:\nFrom: %s\n  To: %s\n" "$checkstr" "$sha1sumstr"
            if [ "${checkarr[1]}" == "$fp" ]; then
              printf "Filname not changed\n"
            else
              checkname="$(grep -h $fp ../prev_check)"
              if [ -n  "$checkname" ]; then
                  printf "$checkname\n" 
                  printf "Name is the same\n"
              else
                  printf "Name Changed: %s\n" "$fp"
              fi
            fi
          fi
          echo "$sha1sumstr" >> ../new_check
      done
      mv ../new_check ../prev_check
      

      保存脚本更改后的示例输出:

      bob@squids:~/Development/fileshare/testdir$ ./check_name_change.sh 
      
      Checking: a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0 with filepath ./test.txt
      
      nochange
      
      Checking: c97a03c8d412ad7a4579fa59b33056253e8113a3 with filepath ./testchilddir/test.txt
      
      nochange
      
      Checking: b8cf155a4ca493f0e8c598e92f212947c13b8842 with filepath ./check_name_change.sh
      Possibly new file:
      From: 
        To: b8cf155a4ca493f0e8c598e92f212947c13b8842  ./check_name_change.sh
      f46261e680c1f28d7537ac332c02e23fa2e7382b  ./check_name_change.sh
      Name is the same
      

      test.txt的名称更改为changed.txt后的示例输出:

      bob@squids:~/Development/fileshare/testdir$ ./check_name_change.sh 
      
      Checking: c97a03c8d412ad7a4579fa59b33056253e8113a3 with filepath ./testchilddir/test.txt
      
      nochange
      
      Checking: b8cf155a4ca493f0e8c598e92f212947c13b8842 with filepath ./check_name_change.sh
      
      nochange
      
      Checking: a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0 with filepath ./changed.txt
      Possibly new file:
      From: a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0  ./test.txt
        To: a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0  ./changed.txt
      Name Changed: ./changed.txt
      

      如果检查大量文件,这将是一个缓慢的解决方案。

      【讨论】:

        猜你喜欢
        • 2015-06-08
        • 2012-11-14
        • 2011-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-07
        • 1970-01-01
        • 2014-07-29
        相关资源
        最近更新 更多