ファイルをフォルダに圧縮する方法

ファイルをフォルダに圧縮する方法

私のファイル構造は次のようになります。

- root_folder_with_bad_name
  - file1
  - file2
  - file3

次の構造のzipアーカイブをインポートする必要があります。

- archive.zip
  - some_folder
    - file1
    - file2
    - file3

ファイルのroot_folder名がわからないため、これを行うことはできません。

zip archive.zip some_root_folder_name

このフォルダ内のファイルを圧縮できるようにしたいです。どうすればいいですか?

答え1

ターゲットアーカイブフォルダ名を使用して、一時ディレクトリ階層を作成して圧縮し、削除できます。

これは、現在のディレクトリにbash名前が付けられたディレクトリ(またはファイル)がないと仮定して機能します。archive

(
    shopt -s extglob
    mkdir archive &&
        cp -al !(archive) archive &&
        zip -r archive.zip archive
    rm -rf archive
)

新しいディレクトリ階層はコピーされずに接続されるため、(a) 高速化し、(b) かなりの追加ディスク領域を占有しません。

実際のケース

# Set up the files in a directory
mkdir secret_name; touch secret_name/file{1,2,3}
cd secret_name/

# Now create the archive
( shopt -s extglob; mkdir archive && cp -al !(archive) archive/ && zip -r archive.zip archive; rm -rf archive )

# List the archive
unzip -l archive.zip

Archive:  archive.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2020-10-16 19:21   archive/
        0  2020-10-16 19:12   archive/file2
        0  2020-10-16 19:12   archive/file3
        0  2020-10-16 19:12   archive/file1
---------                     -------
        0                     4 files

答え2

zip元のファイルと名前やパスが異なるアーカイブにファイルを保存したいようです。パスを完全に削除することに加えて、ファイルのパスやファイル名を変更するzipことはできません。一般的に使用されるユーティリティを使用します。

回避策として、ハードリンクを使用して一時フォルダに目的のディレクトリ構造を作成できます。

tar(人がなぜ.とを言及するgzipのかわからないzip

答え3

libarchivebsdtarとその-sオプションを使用して、アーカイブに追加されたファイルのパスを編集できます。

$ ls
file1  file2  file3
$ bsdtar --format=zip -'s|^\.|some_folder|' -cf ../file.zip .
$ unzip -l ../file.zip
Archive:  ../file.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2020-10-16 21:15   some_folder/
        0  2020-10-16 21:15   some_folder/file1
        0  2020-10-16 21:15   some_folder/file3
        0  2020-10-16 21:15   some_folder/file2
---------                     -------
        0                     4 files

答え4

また、これはファイルをコピーせずにシンボリックリンクを使用して動作するようです。

> ls old_parent/
file1  file2

> ln -s old_parent new_parent

> zip -r archive.zip new_parent
  adding: new_parent/ (stored 0%)
  adding: new_parent/file2 (deflated 22%)
  adding: new_parent/file1 (deflated 38%)

> unzip -l archive.zip 
Archive:  archive.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2020-10-16 22:48   new_parent/
       50  2020-10-14 08:18   new_parent/file2
      348  2020-10-16 13:58   new_parent/file1
---------                     -------
      398                     3 files

> rm new_parent

関連情報