親ディレクトリがないディレクトリのすべてのファイルとサブフォルダを圧縮します。

親ディレクトリがないディレクトリのすべてのファイルとサブフォルダを圧縮します。

次のフォルダ構造があります

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-pathsZipコマンドリファレンス

-j
--junk-paths

ディレクトリ名は保存されず、保存されたファイルの名前だけが保存されます(パスを無視)。デフォルトでは、zipフルパス(現在のディレクトリベース)が保存されます。

注意回答

関連情報