我在 Windows 机器上创建了一个 .zip(在我的控制范围之外)。zip 文件包含解压缩时需要保留的路径。
但是,当我解压缩时,所有文件都像:
unzip_dir/\window\path\separator\myfile.ext
我已经尝试过,有和没有-j选择。我的问题是,我需要在这条道路的信息\window\path\separator\。我需要在解压缩时创建该文件结构。
我可以在脚本中轻松地mv将文件和翻转\到/,但随后出现目标路径目录不存在的错误。我现在的解决方法是mkdir -p路径(转换\为 后/),然后cp是这些路径的文件。
但是有很多文件,mkdir -p每个文件的这些冗余语句确实会减慢速度。
有没有更优雅的方法将带有 Windows 路径的 zip 文件转换为 Linux 路径?
我认为创建 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可能没有任何子目录可以开始,程序只能遍历当前目录中的文件。
使用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)