搜索已知sha1总和的文件

我必须找到已知sha1 sum的特定文件。 我知道文件应该在哪个文件夹中,但是有子文件夹(最大深度为4)。 我知道文件名的更多或更少部分(包含单词“project”和“screenshoot”),但有各种可能的文件格式(.ods,.docx,.pdf …)。 当然,我知道它有什么样的总和。 怎么找到它?

我必须为大约15个文件执行此操作。

找到+ grep

使用find命令

find /that/directory -type f -exec sha1sum {} \; | grep 'known sha1 sum' 

这种方式的工作方式如下:

  • find将在/that/directory上递归操作
  • -type f允许我们只过滤掉常规文件
  • exec sha1sum {} \; 将执行sha1sum命令,每个文件作为参数(这是{}括号表示)
  • grep 'known sha1sum'允许我们过滤find命令的输出,以获得我们需要的sha1 hashsum的输出行。

Bash的全球明星

可以做的另一件事是使用bashglobstar来启用递归通配,并以这种方式迭代。 这是我如何搜索已知sha1sum的文件

 bash-4.3$ shopt -s globstar ; bash-4.3$ known_sha1sum="4b1e65aab01f76b8863707eda5215af09633d275" bash-4.3$ for f in ./**/* ; do [ -f "$f" ] && shasum=$(sha1sum "$f" | awk '{print $1}'); [ "$shasum" = "$known_sha1sum" ] && echo "$f"; done ./golang/hello_world 

我们可以将其缩短,而不是通过for循环迭代:

 bash-4.3$ shopt -s globstar bash-4.3$ sha1sum ./**/* 2>/dev/null | grep '4b1e65aab01f76b8863707eda5215af09633d275'4b1e65aab01f76b8863707eda5215af09633d275 ./golang/hello_world 

虽然这个方法可能很短,但我会对具有大量文件的目录持怀疑态度,其中glob可能会扩展到最大量的命令行参数范围之外。 买者自负

Python 3

当然是一个Python爱好者,我不能不为此任务提供python脚本而离开。 此脚本采用多个参数,因此您可以指定需要查找的多个sha1sum,这与针对多个文件执行此任务的问题的要求一致。

请注意,该脚本假定您要从当前工作目录搜索到子目录,因此请确保首先cd到所需的顶级目录

 #!/usr/bin/env python3 import os import sys from hashlib import sha1 def get_sha1sum(file_path): sha1sum = sha1() with open(file_path, 'rb') as fd: data_chunk = fd.read(1024) while data_chunk: sha1sum.update(data_chunk) data_chunk = fd.read(1024) return str(sha1sum.hexdigest()) def find_files(treeroot): for dir,subdirs,files in os.walk(treeroot): for f in files: full_path = os.path.join(dir,f) path_sha1sum = get_sha1sum( full_path ) if path_sha1sum in sys.argv[1:]: print(path_sha1sum,full_path) def main(): find_files('.') if __name__ == '__main__': main() 

测试运行:

 $ ./find_with_sha1.py '4b1e65aab01f76b8863707eda5215af09633d275' '38ab29bdda161da8082cbbc97d33747dff6fb848' 4b1e65aab01f76b8863707eda5215af09633d275 ./golang/hello_world 38ab29bdda161da8082cbbc97d33747dff6fb848 ./golang/hello_world.go 

我的个人GitHub存储库中也提供了此脚本,此脚本中将添加进一步的开发和更改。

findsha1sumgrep的组合怎么样:

 find . -maxdepth 4 -type f | xargs -IF sha1sum "F" | grep 83976c8060222298565fd434c64ee09d19733559