Zipファイル内の不要なパスを避ける


49

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

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を使用しています。

回答:


85

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

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

その結果、必要な相対パスを含むout.zip作成されます。

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


8
問題ない。私は常にコマンドラインのワンライナーでこれを行い$ pushd /some/path ; do-something ; popdます。例:...またはサブシェルでも:$ ( cd /some/path ; do-something )
クワックキホーテ

1
@〜quack:特にコメント内のサブシェル技術に対して+1。
ジョナサンレフラー

1
&&代わりに使用することを;お勧めしますが、cd失敗した場合は他のコマンドが実行されないように(タイプミスまたはその他の問題):(cd /some/path && do-something)
Chris Johnsen

3
zipファイルの絶対パスを指定せずにこれを行う方法はありませんか?
orange80

2
なぜパスでゲームをプレイしているのですか?なぜ使用しないのzip -jですか?
JWW

5

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

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

保存されたファイルの名前だけを保存し(パスをジャンク)、ディレクトリ名は保存しません。デフォルトでは、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

5
これは、「フォルダ」ディレクトリ内のパスも含め、すべてのパスをジャンクしませんか?OPはコマンドラインのパスのみを削除したいと考えています。
ピータージャリック

1
これはこの質問に対する答えではないかもしれませんが、私が必要とするものです。
アーロンマクミリン

1
この回答は、ユーザーがフラットzipを望んでいると誤って仮定しています。これは悪い仮定であり、異なるサブフォルダー内の2つのファイルの名前が同じ場合、スクリプトが失敗する可能性があります。
アンドリューシュワルツ

1

あるpushdpopd$OLDPWD。であると仮定する$PWD/Users/me/development

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

今すぐ$PWDに帰ってきました/Users/me/development

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.