从 7-zip 存档中逐一提取文件名,并将该名称用作终端中 java 程序的参数

从 7-zip 存档中逐一提取文件名,并将该名称用作终端中 java 程序的参数

我正在尝试编写一个 bash 脚本,该脚本首先从存档中逐个提取文件,然后使用文件名作为参数调用 java 程序来执行某些操作。我已尝试使用以下脚本,但它不起作用。

我面临以下问题:

假设压缩文件名为compressed.7z.假设压缩的.7z 存档中有两个文件:sample_1.jsonsample_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}'.要将命令的输出作为脚本中的值获取,我们可以使用命令替换$()语法。

您可以使用ecommand 而不是x7za文件提取命令中使用,因为您只提取文件,不需要存档中的任何目录结构。不要忘记提供存档名称作为参数。

根据上述内容,脚本将如下所示:

#!/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的功能,将每个成员通过管道传输到程序,而不是将其存储在磁盘上。7zustartartartar--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"'

相关内容