というファイルがあります'sourceZip.zip'
このファイル('sourceZip.zip'
)には2つのファイルが含まれています。
'textFile.txt'
'binFile.bin'
私に電話した別の人もいます。'targetZip.zip'
ファイル('targetZip.zip'
)には次のファイルが含まれています。
'jpgFile.jpg'
'textFile.txt'
Linuxでは、2つのファイル(、'binFile.bin'
)をソースアーカイブ('sourceZip.zip'
)から2番目のアーカイブ'targetZip.zip'
()に直接コピーして、プロセスが終了したときに2番目のアーカイブ('targetZip.zip'
)に3つのファイルをすべて含めるには、どのbashコマンドを使用する必要がありますか?
(理想的には、「zip」または「unzip」を使用して1つのコマンドでこれを実行できます)
答え1
一般的なコマンドラインzip
ツールを使用すると、個別の抽出および更新コマンドを回避できないようです。
source_zip=$PWD/sourceZip.zip
target_zip=$PWD/targetZip.zip
temp_dir=$(mktemp -dt)
( cd "$temp_dir"
unzip "$source_zip"
zip -g "$targetZip" .
# or if you want just the two files: zip -g "$targetZip" textFile.txt binFile.bin
)
rm -rf "$temp_dir"
より便利なzipファイル操作ライブラリを持つ他の言語があります。例えば、パールとアーカイブ::郵便番号。エラーチェックを省略します。
use Archive::Zip;
my $source_zip = Archive::Zip->new("sourceZip.zip");
my $target_zip = Archive::Zip->new("targetZip.zip");
for my $member ($source_zip->members()) {
# or (map {$source_zip->memberNamed($_)} ("textFile.txt", "binFile.bin"))
$target_zip->addMember($member);
}
$target_zip->overwrite();
別の方法は、zipファイルをディレクトリにマウントすることです。 zipファイルの1つをマウントすれば十分です。zip
または反対側に使用することができます。unzip
AVFSさまざまなアーカイブ形式の読み取り専用サポートを提供します。
mountavfs
target_zip=$PWD/targetZip.zip
(cd "$HOME/.avfs$PWD/sourceZip.zip#" &&
zip -g "$target_zip" .) # or list the files, as above
umountavfs
ヒューズジッパー.zipアーカイブを使用できるように、zipアーカイブへの読み取りおよび書き込みアクセスを提供しますcp
。
source_dir=$(mktemp -dt)
target_dir=$(mktemp -dt)
fuse-zip sourceZip.zip "$source_dir"
fuse-zip targetZip.zip "$target_dir"
cp -Rp "$source_dir/." "$target_dir" # or list the files, as above
fusermount -u "$source_dir"
fusermount -u "$target_dir"
rmdir "$source_dir" "$target_dir"
警告:私はこのスクリプトをブラウザに直接入力します。自分の責任で使用してください。
答え2
不確実な次へ追加アーカイブされましたが、いつでも再作成できます。
unzip a.zip -d tmp
unzip b.zip -d tmp
zip -r c.zip tmp
最初の2行はアーカイブの圧縮をtmp
ディレクトリに解凍し、3行目は再度解凍します。
答え3
zipmerge
これを行うツールがあります。ページの説明はman
次のとおりです。
zipmerge ソース zip アーカイブ source-zip をターゲット zip アーカイブ target-zip にマージします。デフォルトでは、ソースzipアーカイブのファイルは、ターゲットzipアーカイブの同じ名前の既存のファイルを上書きします。
答え4
私は率直に申し上げますが、実用的な観点から見ると答えがわかりません。
ただし、理論的な観点から見ると、ファイルを解凍して再圧縮する必要があります。もちろん圧縮された状態に移動することはできませんか?まず、両方のzipファイルの圧縮モードとレベル設定が同じであると仮定する必要があります。
unzip と zip コマンドを一緒にリンクできますが、そうなるとコマンドラインでコマンドを処理する問題になるので *nix 専門家に任せます。
私はいつも校正する準備ができています。