あるZipから別のZipにファイルをコピーしますか?

あるZipから別のZipにファイルをコピーしますか?

というファイルがあります'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または反対側に使用することができます。unzipAVFSさまざまなアーカイブ形式の読み取り専用サポートを提供します。

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 専門家に任せます。

私はいつも校正する準備ができています。

関連情報