一部のファイルをパッケージ化するためのシェルスクリプトを作成しています。私はこのようなディレクトリを圧縮しています:
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を使用しています。
スクリプトはcd
またはpushd
とpopd
を使用して、アーカイブのルートになるディレクトリに移動する必要がありますbeforeZip
コマンド。これを正確に行う方法は、スクリプトがZipアップする対象をどのように認識するかによって異なります。ただし、必要な場合は/ Users/me/development/something/folder内部パスを圧縮した./ folderの場合、次のようにする必要があります。
pushd /Users/me/development/something
Zip -r /path/to/out.Zip ./folder/
popd
out.Zipには、必要な相対パスが含まれます。
スクリプトの作成についてサポートが必要な場合は、スクリプトを見せてください。
問題は、結果の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
pushd
とpopd
と$OLDPWD
があります。 $PWD
が/Users/me/development
であると仮定すると、次のようになります。
pushd something/folder
Zip -r $OLDPWD/something/out.Zip *
popd
$PWD
が/Users/me/development
に戻りました
@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
_