Cómo comprimir archivos como carpeta
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
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).
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
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
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