Я хотел бы рекурсивно сканировать данный каталог на наличие всех файлов .zip, извлекать текст из каждого такого файла с помощью Apache Tika (в моем случае это скрипт /opt/solr/bin/post) в один текстовый файл и помещать этот текстовый файл в тот же каталог, где находится оригинал zip файл есть.
Чтобы рекурсивно найти все zip-файлы и извлечь весь контент, который я использую:
find . -name "*zip" -exec sh -c 'f = "{}"; /opt/solr/bin/post "$f" \
-params = "...params..." > "$f.txt"' \;
Содержимое извлеченного файла:
java -classpath /opt/solr/dist/solr-core-8.7.0.jar -Dauto=yes -Dout=yes -
Dparams=literal.search_area=test&extractOnly=true
&extractFormat=text&defaultField=text -Dc=mycoll
-Ddata=files org.apache.solr.util.SimplePostTool zip.zip
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/mycoll/update?
literal.search_area=test&extractOnly=true&extractFormat=text
&defaultField=text...
Entering auto mode. File endings considered are
xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,
odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log
POSTing file zip.zip (application/octet-stream) to [base]/extract
{
"responseHeader":{
"status":0,
"QTime":1614},
"":"**EXTRACTED TEXT**",
"null_metadata":[
"stream_size",["79855"],
"X-Parsed-By",["org.apache.tika.parser.DefaultParser",
"org.apache.tika.parser.pkg.PackageParser"],
"stream_content_type",["application/octet-stream"],
"resourceName",["/mnt/remote/users/zhilov/!tmp/zip.zip"],
"Content-Type",["application/zip"]]}
1 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/mycoll/update?
literal.search_area=test&extractOnly=true&
extractFormat=text&defaultField=text...
Time spent: 0:00:03.495
Из этого вывода я хотел бы вырезать начало и конец файла, оставив только ИЗВЛЕКАННЫЙ ТЕКСТ внутри сгенерированного файла для дальнейшего индексирования.
Возможно ли выполнить все эти операции в одной командной строке bash? Или хотя бы с помощью bash-скрипта?
@Beta Да, что-то вроде этого, спасибо. Но не буквально ИЗВЛЕКАННЫЙ ТЕКСТ, а просто любой текст в этом поле неизвестной длины.
Наверное, что-то между "QTime":dd}, "":" и ", "null_metadata":[. И если мы пойдем с sed, мне нужно будет как-то решить проблемы с UTF-8, поскольку текст, выходящий после sed, искажен, в то время как я получаю это ОК на предыдущем шаге.
Обратите внимание, что find ... -exec sh -c '...{}...' открывает вас для атак с внедрением оболочки; с точки зрения безопасности это очень плохая идея. Гораздо безопаснее использовать find ... -exec sh -c 'for arg in "$@"; do ...; done' _ {} +, который передает имена найденных файлов в $1, $2 и т. д. вместо того, чтобы смешивать имя файла со строкой кода (и, таким образом, рисковать, что имя файла будет проанализировано как код).





Попробуй это:
sed -n '/QTime/{N;s/.*\n.*:.//;s/.,$//p;}'
Этот вопрос касается проблемы UTF-8.
Это очень близко, большое спасибо. Мне пришлось добавить к этому один ", так как я получал неправильные результаты, поэтому последняя команда стала: sed -n '/QTime/{N;s/.*\n.*:".//;s/.,$//p;}'. И последнее, как я могу теперь объединить все это в одну строку? Пока что мне нужно find . -name "*zip" -exec sh -c 'f = "{}"; /opt/solr/bin/post "$f" \ -params = "...params..." > "$f.txt"' \; сохранить необработанный вывод в файл, а затем мне нужно будет снова узнать имя файла и запустить на нем вашу команду sed.
Я обновил свой вопрос реальным примером в конце
Хорошо, мне удалось сделать это с опцией sed -i.
Знаешь, если я получу \nRE: Subject... в тексте до того, как его вырежут
@ user164863: Я не могу воспроизвести новую ошибку.
Как насчет
sed -n '17{s/^........//;s/....$//;p;}'?