#python-3.x #windows #batch-file #cmd #grep
#python-3.x #Windows #пакетный файл #cmd #grep
Вопрос:
Пожалуйста, может кто-нибудь помочь мне с альтернативой для Windows следующей команде:
Версия Linux: найдите Win32_EXE -введите f -name ‘*.json’ -exec grep —files-with-match -i ‘dbtool’ ‘{}’ ;
Версия для Windows: FIND / i «dbtool» Win32_EXE *.json
Проблема: в синтаксисе Windows отсутствует опция, позволяющая мне указать, что я хочу, чтобы результат возвращался при первом совпадении.
Комментарии:
1. Обязательно ли это должен быть Python или вы можете использовать powershell?
2. В этом случае он должен быть таким, чтобы он запускался через скрипт python.
Ответ №1:
В python я бы использовал рекурсивный глобус:
from glob import iglob
def search(file):
with open(file) as fo:
for line in fo:
if "dbtool" in line.lower():
return True
return False
for file in iglob("Win32_EXE/**/*.json", recursive=True):
if search(file):
print(file)
но я думаю, что в целом я бы не стал использовать Python — другие решения, вероятно, быстрее / лучше.
например, Powershell
get-childitem -recurse *.json | where-object { select-string -quiet -pattern "dbtool" -path $_ }
или, если вы можете установить ripgrep, это работает хорошо.
rg -l -g "*.json" -i dbtool Win32_EXE
Ответ №2:
Это приведет к поиску файлов * .json и поиску в них строки dbtool
. Измените каталог PUSHD на свой каталог поиска.
PUSHD "C:srct"
FOR /F "delims=" %%A IN ('DIR /S /B /A:-D "*.json"') DO (
FIND /I "dbtool" "%%~A"
)
POPD