【发布时间】:2021-03-28 10:51:11
【问题描述】:
我想递归扫描给定目录中的所有 .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
我想从该输出中删除文件的开头和结尾,只在生成的文件中留下 EXTRACTED TEXT 以供进一步索引。
是否可以在一个 bash 命令行中完成所有这些操作?或者至少使用 bash 脚本?
【问题讨论】:
-
sed -n '17{s/^........//;s/....$//;p;}'怎么样? -
@Beta 是的,像这样,谢谢。但不是字面上的提取文本,只是该字段中未知长度的任何文本
-
可能介于
"QTime":dd}, "":"和", "null_metadata":[之间。如果我们选择sed,我需要以某种方式解决 UTF-8 问题,因为在sed之后出现的文本是乱码,而我在上一步中就可以了 -
请注意,
find ... -exec sh -c '...{}...'让您面临 shell 注入攻击;从安全的角度来看,这是一个非常糟糕的主意。使用find ... -exec sh -c 'for arg in "$@"; do ...; done' _ {} +更安全,它将定位文件的名称传递给$1、$2等,而不是将文件名混入一串代码中(从而冒着文件名被解析为 代码)。
标签: bash sed solr find apache-tika