まず、アーカイブからファイルを1つずつ抽出し、ファイル名を引数としてJavaプログラムを呼び出していくつかのタスクを実行するbashスクリプトを作成しようとしています。次のスクリプトを試しましたが、うまくいきません。
私は次の問題に直面しています:
圧縮ファイルの名前がcompressed.7z
.7zアーカイブに2つのファイルがあるとします。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
使用できます。アーカイブ名をパラメータとして提供することを忘れないでください。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