Я должен найти конкретный файл с известной суммой sha1. Я знаю, в какой папке должен быть файл, но есть подпапки (до макс. Глубины 4). Я знаю более или менее части имени файла (содержит слова «проект» и «снимок экрана»), но существуют различные возможные форматы файлов (.ods, .docx, .pdf ...). И, конечно, я знаю, какая у него сумма. Как это найти?
Я должен сделать это примерно для 15 файлов.
Используйте находят команду
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
globstar
включить рекурсивный globbing и выполнить итерации того пути. Вот то, как я искал бы файл с известным 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
Вместо того, чтобы выполнить итерации через для цикла, мы можем сделать это еще короче:
bash-4.3$ shopt -s globstar
bash-4.3$ sha1sum ./**/* 2>/dev/null | grep '4b1e65aab01f76b8863707eda5215af09633d275'4b1e65aab01f76b8863707eda5215af09633d275 ./golang/hello_world
В то время как этот метод мог бы быть сокращен, я буду скептически относиться к этому методу на каталоге с большой суммой файлов, где шарик мог бы расшириться за пределами диапазона максимального количества параметров командной строки. Принцип "качество на риск покупателя"
Конечно, будучи поклонником 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 respository, где дальнейшее развитие и изменения будут добавлены к этому сценарию.
Как насчет комбинации find
, sha1sum
и grep
:
find . -maxdepth 4 -type f | xargs -IF sha1sum "F" | grep 83976c8060222298565fd434c64ee09d19733559