将 Windows 创建的 ZIP 转换为 Linux(内部路径问题)

Sla*_*lav 15 zip filenames

我在 Windows 机器上创建了一个 .zip(在我的控制范围之外)。zip 文件包含解压缩时需要保留的路径。

但是,当我解压缩时,所有文件都像:
unzip_dir/\window\path\separator\myfile.ext

我已经尝试过,有和没有-j选择。我的问题是,我需要在这条道路的信息\window\path\separator\。我需要在解压缩时创建该文件结构。

我可以在脚本中轻松地mv将文件和翻转\/,但随后出现目标路径目录不存在的错误。我现在的解决方法是mkdir -p路径(转换\为 后/),然后cp是这些路径的文件。

但是有很多文件,mkdir -p每个文件的这些冗余语句确实会减慢速度。

有没有更优雅的方法将带有 Windows 路径的 zip 文件转换为 Linux 路径?

Ant*_*hon 8

我认为创建 zip 文件时出了点问题,因为当我在 Windows 上创建 zip 文件时有(可移植的)正斜杠:

zip.exe -r pip pip
updating: pip/ (244 bytes security) (stored 0%)
  adding: pip/pip.log (164 bytes security) (deflated 66%)
Run Code Online (Sandbox Code Playgroud)

但是现在您的文件名包含带有反斜杠的“路径”,您可以在 中运行以下程序unzip_dir

#! /usr/bin/env python

# already created directories, walk works topdown, so a child dir
# never creates a directory if there is a parent dir with a file.
made_dirs = set()

for root, dir_names, file_names in os.walk('.'):
    for file_name in file_names:
        if '\\' not in file_name:
            continue
        alt_file_name = file_name.replace('\\', '/')
        if alt_file_name.startswith('/'):
            alt_file_name = alt_file_name[1:]  # cut of starting dir separator
        alt_dir_name, alt_base_name = alt_file_name.rsplit('/', 1)
        print 'alt_dir', alt_dir_name
        full_dir_name = os.path.join(root, alt_dir_name)
        if full_dir_name not in made_dirs:
            os.makedirs(full_dir_name)  # only create if not done yet
            made_dirs.add(full_dir_name)
        os.rename(os.path.join(root, file_name),
                  os.path.join(root, alt_file_name))
Run Code Online (Sandbox Code Playgroud)

这将处理程序启动目录下的任何目录中的文件。鉴于您描述的问题,unzip_dir可能没有任何子目录可以开始,程序只能遍历当前目录中的文件。


xn.*_*xn. 7

使用7z rn到归档内的文件重命名,使他们有一个正斜杠。然后,当您解压缩存档时,将创建目录。

要重命名文件,请列出存档中包含斜杠的文件的路径,并生成替换字符串列表awk,例如使用 将反斜杠更改为斜杠。

7z rn windows.zip $(7z l windows.zip | grep '\\' | awk '{ print $6, gensub(/\\/, "/", "g", $6); }' | paste -s)
Run Code Online (Sandbox Code Playgroud)