次のフォルダ構造があります
folder
|
|--foo.txt
|
|--sub_folder
|
|--bar.txt
zipアーカイブにルートフォルダを含めずにフォルダ(ファイルとサブフォルダ)の内容を圧縮したいと思います。
私はコマンドを試しました
zip -r package.zip folder
ただし、これにはルートフォルダが含まれます。また、次の形式を試しました。
zip -j -r package.zip folder
ただし、これによりすべてのディレクトリ構造が平坦化され、ファイルのみが含まれます。内部ディレクトリ構造を維持しますが、親フォルダを無視する方法は?
答え1
zip
パスは現在のディレクトリ(呼び出し時)に基づいて保存されるため、変更する必要があります。
(cd folder && zip -r "$OLDPWD/package.zip" .)
&&
ディレクトリが正しく変更された場合にのみ実行し、角かっこzip
はサブシェルのすべてのエントリを実行するため、現在のディレクトリは最後に復元されます。OLDPWD
計算を避ける相対パスを使用してくださいpackage.zip
。
答え2
zip -r package.zip folder/*
上記のコマンドは、folder
ディレクトリの下のすべてのファイルとサブフォルダを圧縮します(フォルダの親ディレクトリは無視されます)。
答え3
他の回答に追加するには、スクリプトで使用できます
pushd folder; zip -r ../package.zip .; popd
pushd
ディレクトリの変更は同様ですcd
が、以前のディレクトリが記憶され、popd
最後に記憶されたディレクトリが復元されます。
; cd ..
この場合、角かっこを削除し(新しいシェルを作成し)、Stephenが提案したようにコマンドの最後に追加するのと同じです。
注:これをコメントとして追加したいのですが、評判が足りないため追加できません。
答え4
親ディレクトリを回避してファイルのみを圧縮するには、コマンドに-j
またはを使用する必要があります。--junk-paths
Zipコマンドリファレンス
-j
--junk-paths
ディレクトリ名は保存されず、保存されたファイルの名前だけが保存されます(パスを無視)。デフォルトでは、
zip
フルパス(現在のディレクトリベース)が保存されます。