
まず、アーカイブからファイルを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
答え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
'
ファイルをGNUとして動的にbsdtar
再フォーマットし(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"'