7-zip アーカイブからファイル名を 1 つずつ抽出し、その名前を端末の Java プログラムの引数として使用します。

7-zip アーカイブからファイル名を 1 つずつ抽出し、その名前を端末の Java プログラムの引数として使用します。

まず、アーカイブからファイルを1つずつ抽出し、ファイル名を引数としてJavaプログラムを呼び出していくつかのタスクを実行するbashスクリプトを作成しようとしています。次のスクリプトを試しましたが、うまくいきません。

私は次の問題に直面しています:

圧縮ファイルの名前がcompressed.7z.7zアーカイブに2つのファイルがあるとします。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}'。コマンドの出力をスクリプトの値として取得するには、次を使用できます。コマンドの置き換えそして$()文法。

ファイルを抽出するだけでアーカイブにディレクトリ構造が必要ないため、ファイル抽出コマンドの代わりにコマンドをe使用できます。アーカイブ名をパラメータとして提供することを忘れないでください。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

おすすめ記事