搜索已知 sha1 值的文件

搜索已知 sha1 值的文件

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

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

答案1

查找 + grep

使用查找命令

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

其工作方式如下:

  • find将递归操作/that/directory
  • -type f允许我们仅过滤掉常规文件
  • exec sha1sum {} \;sha1sum使用每个文件作为参数执行命令(这就是{}括号所表示的)
  • grep 'known sha1sum'允许我们过滤命令的输出find以获取具有我们需要的 sha1 哈希值的输出行。

Bash 的 globstar

可以做的另一件事是使用bash'sglobstar来启用递归通配符,并以此方式进行迭代。下面是我如何搜索具有已知 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 存储库,其中将对该脚本进行进一步的开发和修改。

答案2

find那么,将sha1sum和结合起来怎么样grep

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

相关内容