Filenames

將 Windows 創建的 ZIP 轉換為 Linux(內部路徑問題)

  • December 30, 2021

我在 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%)

但是現在您有了文件名包含帶有反斜杠的“路徑”的文件,您可以在中執行以下程序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))

這將處理程序啟動目錄下的任何目錄中的文件。鑑於您描述的問題,unzip_dir可能沒有任何子目錄可以開始,並且程序只能遍歷目前目錄中的文件。

用於7z rn重命名存檔中的文件,以便它們具有正斜杠。然後,當您提取存檔時,將創建目錄。

awk要重命名文件,請列出包含斜杠的存檔中文件的路徑,並生成替換字元串列表,例如使用 將反斜杠更改為斜杠。

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

引用自:https://unix.stackexchange.com/questions/166159