![从 7-zip 存档中逐一提取文件名,并将该名称用作终端中 java 程序的参数](https://linux22.com/image/195649/%E4%BB%8E%207-zip%20%E5%AD%98%E6%A1%A3%E4%B8%AD%E9%80%90%E4%B8%80%E6%8F%90%E5%8F%96%E6%96%87%E4%BB%B6%E5%90%8D%EF%BC%8C%E5%B9%B6%E5%B0%86%E8%AF%A5%E5%90%8D%E7%A7%B0%E7%94%A8%E4%BD%9C%E7%BB%88%E7%AB%AF%E4%B8%AD%20java%20%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%8F%82%E6%95%B0.png)
我正在尝试编写一个 bash 脚本,该脚本首先从存档中逐个提取文件,然后使用文件名作为参数调用 java 程序来执行某些操作。我已尝试使用以下脚本,但它不起作用。
我面临以下问题:
假设压缩文件名为compressed.7z
.假设压缩的.7z 存档中有两个文件:sample_1.json
和sample_2.json
(可以是任何内容)。该7za
命令始终输出compressed.7z
为文件名,这是我不想要的。我只想sample_1.json
在输出文件夹中提取提取的内容,并将名称指定给 java 命令,然后sample_2.json
在下一次迭代中进行。
有人可以帮助解决这个问题吗?提前致谢。
#!/bin/bash
for file in *.7z
do
7za x -ooutput "${file}" | java -jar Remove_BoilerPlate_JSON_Updated.jar "${file}";
done
答案1
这可能不是最有效的方法,但这就是您所要求的。
首先,您需要存档中的文件列表。您可以通过 获取它7za l
。有一个无证的 -ba
使输出的开关更容易加工。我们可以取最后一列该输出的内容包含存档文件的名称,扩展名为awk '{print $NF}'
.要将命令的输出作为脚本中的值获取,我们可以使用命令替换与$()
语法。
您可以使用e
command 而不是x
在7za
文件提取命令中使用,因为您只提取文件,不需要存档中的任何目录结构。不要忘记提供存档名称作为参数。
根据上述内容,脚本将如下所示:
#!/bin/bash
for file in $(7za l -ba compressed.7z | awk '{print $NF}')
do
7za x -ooutput compressed.7z "$file"
java -jar Remove_BoilerPlate_JSON_Updated.jar output/"$file"
done
答案2
使用 libarchive bsdtar
+ GNU tar
,您可以执行以下操作:
bsdtar cf - @compressed.7z |
tar -x --to-program='
cat > file.json &&
java -jar Remove_BoilerPlate_JSON_Updated.jar file.json
'
其中,动态地将文件bsdtar
重新格式化为 GNU (因为 GNU不支持 7z 格式),并使用 GNU的功能,将每个成员通过管道传输到程序,而不是将其存储在磁盘上。7z
ustar
tar
tar
tar
--to-program
在这里,我们总是将输入存储到该文件中file.json
并调用java
该文件。如果java
可以直接从标准输入获取输入,--to-program='java -jar Remove_BoilerPlate_JSON_Updated.jar'
那么您可以这样做。或者可能--to-program='java -jar Remove_BoilerPlate_JSON_Updated.jar /dev/stdin'
。
如果java
接收存储在存档中的文件名很重要,您可以从$TAR_FILENAME
环境变量中获取它:--to-program='f=${TAR_FILENAME##*/}; cat > "$f" && java -jar Remove_BoilerPlate_JSON_Updated.jar "$f" && rm -f -- "$f"'