というファイルがあります'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"
警告:私はこのスクリプトをブラウザに直接入力します。自分の責任で使用してください。