私のファイル構造は次のようになります。
- 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