Filenames
將 Windows 創建的 ZIP 轉換為 Linux(內部路徑問題)
我在 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)