Cómo comprimir archivos como carpeta

Oct 16 2020

Tengo una estructura de archivo similar a esta:

- root_folder_with_bad_name
  - file1
  - file2
  - file3

Necesito obtener un archivo zip con esta estructura:

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

No sé el nombre de la carpeta raíz de los archivos, así que no puedo hacer esto:

zip archive.zip some_root_folder_name

Quiero poder comprimir archivos dentro de esa carpeta. ¿Cómo puedo hacer eso?

Respuestas

2 xiota Oct 16 2020 at 22:49

Parece que desea almacenar archivos en ziparchivos con nombres o rutas diferentes a los originales. Aparte de eliminar la ruta por completo, no parece que sea posible modificar las rutas o los nombres de los ziparchivos con las utilidades comúnmente disponibles.

Como solución alternativa, puede crear la estructura de directorios deseada en una carpeta temporal mediante vínculos físicos.

(No tengo idea de por qué las personas se refieren a tary gzip. No son relevantes ya que usted indica específicamente que desea ziparchivos).

3 roaima Oct 17 2020 at 02:22

Puede crear una jerarquía de directorio temporal con el nombre de la carpeta de archivo de destino, comprimirlo y luego eliminarlo.

Esto funciona bash, presuponiendo que no hay un directorio (o archivo) ya nombrado archiveen el directorio actual.

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

Tenga en cuenta que la nueva jerarquía de directorios está vinculada en lugar de copiada, por lo que (a) es rápida, (b) no ocupa ningún espacio extra significativo en el disco.

Ejemplo resuelto

# 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 StéphaneChazelas Oct 17 2020 at 03:17

Puede usar libarchive bsdtary su -sopción para editar las rutas de los archivos agregados al archivo:

$ 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
1 thanasisp Oct 17 2020 at 02:54

Además, esto parece funcionar utilizando un enlace simbólico, sin copiar archivos.

> 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