GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puedo crear un zip/tgz en Linux de modo que Windows tenga nombres de archivo adecuados?

Actualmente, tar codifica nombres de archivos en UTF

En realidad, tar no codifica ni decodifica los nombres de los archivos, simplemente los copia del sistema de archivos tal cual. Si su configuración regional está basada en UTF-8 (como en muchas distribuciones modernas de Linux), será UTF-8. Desafortunadamente, la página de códigos del sistema de un cuadro de Windows nunca es UTF-8, por lo que los nombres siempre se alterarán, excepto en herramientas como WinRAR que permiten cambiar el juego de caracteres.

Por lo tanto, es imposible crear un archivo ZIP con nombres de archivo que no sean ASCII que funcionen en las versiones de Windows de diferentes países y su compatibilidad integrada con carpetas comprimidas.

Es una deficiencia de los formatos tar y zip que no hay información de codificación fija o proporcionada, por lo que los caracteres que no son ASCII nunca serán portátiles. Si necesita un formato de archivo que no sea ASCII, tendrá que usar uno de los formatos más nuevos, como 7z reciente o rar. Desafortunadamente, estos todavía son inestables; en 7zip necesitas el -mcu switch, y rar aún no usará UTF-8 a menos que detecte caracteres que no están en la página de códigos.

Básicamente, es un desastre horrible y si puede evitar la distribución de archivos que contienen nombres de archivo con caracteres que no son ASCII, estará mucho mejor.


Aquí hay una secuencia de comandos de Python simple que he escrito para descomprimir archivos tar de UNIX en Windows:

import tarfile

archive_name = "archive_name.tar"

def recover(name):
    return unicode(name, 'utf-8')

tar = tarfile.open(name=archive_name, mode='r', bufsize=16*1024)
updated = []
for m in tar.getmembers():
    m.name = recover(m.name)
    updated.append(m)

tar.extractall(members=updated)
tar.close()

El problema, usando en Linux el tar por defecto (GNU tar), se soluciona... agregando el --format=posix parámetro al crear el archivo.

Por ejemplo:
tar --format=posix -cf

En Windows, para extraer los archivos, uso bsdtar.

En https://lists.gnu.org/archive/html/bug-tar/2005-02/msg00018.html está escrito (desde 2005 !!):

> Leí algo en el ChangeLog sobre el apoyo de UTF-8. Que hace
> esto significa?
> No encontré forma de crear un archivo que fuera intercambiable
> entre diferentes locales.

Al crear archivos en formato POSIX.1-2001 (tar --format=posix o--format=pax), tar convierte los nombres de los archivos de las configuraciones regionales actuales a UTF-8 y luego los almacena en el archivo. Al extraer, se realiza la operación inversa.

PD En lugar de escribir --format=posix puedes escribir -H pax , que es más corto.


Linux
  1. Cómo crear un archivo ZIP protegido con contraseña en Linux

  2. ¿Cómo puedo usar grep para mostrar solo nombres de archivo en Linux?

  3. Cómo crear un archivo zip compatible con Linux de un directorio en una Mac

  4. ¿Cómo puedo crear un archivo tar de varias partes en Linux?

  5. ¿Cómo puedo instalar Windows 7 sin dvd o usb, en linux?

6 características que Windows 10 ha tomado de Linux

Cómo instalar paquetes .tar.gz o .tgz en Linux

Cómo ejecutar Windows 95 en Linux

Cómo crear un USB de arranque de Windows 10 en Linux

Cómo crear archivos zip o directorios protegidos con contraseña en Linux

Cómo crear un USB de arranque de Windows en Linux