web-dev-qa-db-ja.com

Zipファイルで不要なパスを回避する

一部のファイルをパッケージ化するためのシェルスクリプトを作成しています。私はこのようなディレクトリを圧縮しています:

Zip -r /Users/me/development/something/out.Zip /Users/me/development/something/folder/

問題は、結果のout.Zipアーカイブにファイルパス全体が含まれていることです。つまり、解凍すると、「/ Users/me/development/anotherthing /」パス全体が含まれます。ディレクトリをアーカイブに入れるときにこれらの深いパスを回避することは可能ですか?

ターゲットディレクトリ内からZipを実行すると、この問題は発生しません。

Zip -r out.Zip ./folder/

この場合、私はすべての迷惑メールを取得しません。ただし、問題のスクリプトはどこからでも呼び出されます。

FWIW、Mac OS X 10.6でbashを使用しています。

50
jerwood

スクリプトはcdまたはpushdpopdを使用して、アーカイブのルートになるディレクトリに移動する必要がありますbeforeZipコマンド。これを正確に行う方法は、スクリプトがZipアップする対象をどのように認識するかによって異なります。ただし、必要な場合は/ Users/me/development/something/folder内部パスを圧縮した./ folderの場合、次のようにする必要があります。

pushd /Users/me/development/something
Zip -r /path/to/out.Zip ./folder/
popd

out.Zipには、必要な相対パスが含まれます。

スクリプトの作成についてサポートが必要な場合は、スクリプトを見せてください。

87
quack quixote

問題は、結果のout.Zipアーカイブにファイルパス全体が含まれていることです。
...
ディレクトリをアーカイブに入れるときに、これらの深いパスを回避することは可能ですか?

はい。 Zip-jオプションを使用します。 -jは「ジャンクザパス」です。 Zipのmanページ によると:

保存されたファイルの名前のみを保存(パスをジャンク化)し、ディレクトリ名は保存しません。デフォルトでは、Zipはフルパス(現在のディレクトリからの相対パス)を保存します。

-jを使用すると、次のコマンドを意味します。

Zip -j myarchive.Zip file1.txt dir1/file2.txt dir2/dir3/file3.txt ../file4.txt

次のようなアーカイブを作成します。

myarchive.Zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt
6
jww

pushdpopd$OLDPWDがあります。 $PWD/Users/me/developmentであると仮定すると、次のようになります。

pushd something/folder
Zip -r $OLDPWD/something/out.Zip *
popd

$PWD/Users/me/developmentに戻りました

3

パスを含まず、親ディレクトリを含み、名前をハードコードする必要なしに圧縮する

@quackの承認済み回答のわずかに改良されたバージョン。

スクリプトでこれを行っていて、親ディレクトリをハードコーディングする必要がない場合は、次のようにできます。

_pushd /Users/me/development/something/folder/;
Zip -r ../out.Zip ../$(basename $PWD)
popd;
_

../$(basename $PWD)は、ファイルが抽出されたときに親ディレクトリに確実に保持されるようにします。

したがって、_unzip my.Zip_はすべてのファイルを含むフォルダを提供します。

_folder
├── file1
├── file2
├── dir1
│   ├── file3
│   ├── file4
_

現在のディレクトリを解凍されたファイルで散らかす代わりに:

_file1
file2
dir1
├── file3
├── file4
_
0
AndrewD