Поиск файла с известной суммой sha1

Я должен найти конкретный файл с известной суммой sha1. Я знаю, в какой папке должен быть файл, но есть подпапки (до максимальной глубины 4). Я знаю более или менее части имени файла (содержит слова «проект» и «скриншот»), но существуют различные возможные форматы файлов (.ods, .docx, .pdf ...). И, конечно, я знаю, что это за сумма sha1. Как его найти?

Я должен сделать это примерно для 15 файлов.

3
задан 6 July 2017 в 21:11

6 ответов

find + 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 чтобы получить строку вывода с помощью hashsum sha1, который нам нужен.

globstar Bash

Еще одна вещь, которая может быть сделана, - использовать bash 's globstar, чтобы включить рекурсивное подтачивание и повторить этот путь. Вот как я мог бы искать файл с известным 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

Вместо повторного цикла via for, мы можем сделать это еще короче:

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

Хотя этот метод может быть Короче говоря, я бы скептически относился к этому методу в каталоге с большим количеством файлов, где glob мог бы расширяться за пределами диапазона максимального количества аргументов командной строки. Caveat emptor

Python 3

Конечно, будучи поклонником Python, я не мог уйти, не предоставляя скрипт python для этой задачи. Этот скрипт принимает несколько аргументов, поэтому вы можете указать несколько sha1sums, которые вам нужно найти, что согласуется с требованием вопроса для выполнения этой задачи для нескольких файлов.

Обратите внимание, что сценарий предполагает, что вы хотите выполнить поиск от текущего рабочего каталога до подкаталогов, поэтому убедитесь, что вы 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
ответ дан 22 May 2018 в 20:47

find + 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 чтобы получить строку вывода с помощью hashsum sha1, который нам нужен.

globstar Bash

Еще одна вещь, которая может быть сделана, - использовать bash 's globstar, чтобы включить рекурсивное подтачивание и повторить этот путь. Вот как я мог бы искать файл с известным 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

Вместо повторного цикла via for, мы можем сделать это еще короче:

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

Хотя этот метод может быть Короче говоря, я бы скептически относился к этому методу в каталоге с большим количеством файлов, где glob мог бы расширяться за пределами диапазона максимального количества аргументов командной строки. Caveat emptor

Python 3

Конечно, будучи поклонником Python, я не мог уйти, не предоставляя скрипт python для этой задачи. Этот скрипт принимает несколько аргументов, поэтому вы можете указать несколько sha1sums, которые вам нужно найти, что согласуется с требованием вопроса для выполнения этой задачи для нескольких файлов.

Обратите внимание, что сценарий предполагает, что вы хотите выполнить поиск от текущего рабочего каталога до подкаталогов, поэтому убедитесь, что вы 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
ответ дан 18 July 2018 в 10:38

find + 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 чтобы получить строку вывода с помощью hashsum sha1, который нам нужен.

globstar Bash

Еще одна вещь, которая может быть сделана, - использовать bash 's globstar, чтобы включить рекурсивное подтачивание и повторить этот путь. Вот как я мог бы искать файл с известным 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

Вместо повторного цикла via for, мы можем сделать это еще короче:

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

Хотя этот метод может быть Короче говоря, я бы скептически относился к этому методу в каталоге с большим количеством файлов, где glob мог бы расширяться за пределами диапазона максимального количества аргументов командной строки. Caveat emptor

Python 3

Конечно, будучи поклонником Python, я не мог уйти, не предоставляя скрипт python для этой задачи. Этот скрипт принимает несколько аргументов, поэтому вы можете указать несколько sha1sums, которые вам нужно найти, что согласуется с требованием вопроса для выполнения этой задачи для нескольких файлов.

Обратите внимание, что сценарий предполагает, что вы хотите выполнить поиск от текущего рабочего каталога до подкаталогов, поэтому убедитесь, что вы 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
ответ дан 24 July 2018 в 19:37

Как насчет комбинации find, sha1sum и grep:

find . -maxdepth 4 -type f | xargs -IF sha1sum "F" | grep 83976c8060222298565fd434c64ee09d19733559
1
ответ дан 22 May 2018 в 20:47

Как насчет комбинации find, sha1sum и grep:

find . -maxdepth 4 -type f | xargs -IF sha1sum "F" | grep 83976c8060222298565fd434c64ee09d19733559
1
ответ дан 18 July 2018 в 10:38

Как насчет комбинации find, sha1sum и grep:

find . -maxdepth 4 -type f | xargs -IF sha1sum "F" | grep 83976c8060222298565fd434c64ee09d19733559
1
ответ дан 24 July 2018 в 19:37

Другие вопросы по тегам:

Похожие вопросы: