解压文件时会创建名称带有反斜杠的文件,而不是正确的目录层次结构

解压文件时会创建名称带有反斜杠的文件,而不是正确的目录层次结构

我正在将 RAR 存档中提供给我的网站内容移动到新服务器。

我不太确定它是哪种 Linux 版本;它uname -a告诉我:

Linux bolt.sonic.net 2.4.37.5 #1 SMP Mon Aug 17 10:15:36 PDT 2009 i686 unknown

unrar --help告诉我:

UNRAR 3.00 freeware      Copyright (c) 1993-2002 Eugene Roshal

我并不是 unrar 的常规用户,但就我有限的经验而言,unrar x archive.rar据我所记得,这个简单的命令总能做正确的事情。

但是,当我尝试解压当前存档时,结果是一个扁平结构的目录,其中包含 4500 多个文件和目录,其名称中的目录分隔符处应该有反斜杠,例如:

drwxr-xr-x    2 yoyodyne user         4096 Jan 18 14:53 yoyodyne
drwxr-xr-x    2 yoyodyne user         4096 Jan 18 14:53 yoyodyne\application
drwxr-xr-x    2 yoyodyne user         4096 Jan 18 14:53 yoyodyne\application\config
-rw-r--r--    1 yoyodyne user         2765 Sep 15  2011 yoyodyne\application\config\database.php
-rw-r--r--    1 yoyodyne user         1152 Sep 15  2011 yoyodyne\application\config\doctypes.php
-rw-r--r--    1 yoyodyne user         1844 Sep 15  2011 yoyodyne\application\config\foreign_chars.php
-rw-r--r--    1 yoyodyne user          513 Sep 15  2011 yoyodyne\application\config\hooks.php
-rw-r--r--    1 yoyodyne user          123 Sep 15  2011 yoyodyne\application\config\index.html
...

我完全不明白是什么原因导致这种情况发生,或者如何解决它。我没有看到命令上有任何明显的选项来unrar告诉它,例如,“嘿,我在 Linux 系统上”,或者“嘿,忽略这个存档是在 Windows 系统上创建的事实。”

(实际上,我不知道该档案是否是在 Windows 系统上创建的。向我发送档案的开发人员没有透露,并且之后立即休假了 - 这意味着我得到答复或以不同格式替换档案的机会很小。)

值得一提的是,该程序似乎理解了最后一个反斜杠后面的名称部分是实际的文件名。与上面的部分目录列表相对应的unrar输出部分是:unrar l archive.rar

 Name             Size   Packed Ratio  Date   Time     Attr      CRC   Meth Ver
-------------------------------------------------------------------------------
 database.php     2765     1071  38% 15-09-11 10:57   .....A   13CDB2C8 m3g 2.9
 doctypes.php     1152      381  33% 15-09-11 10:57   .....A   F25E706F m3g 2.9
 foreign_chars.php     1844      856  46% 15-09-11 10:57   .....A   12AF75FD m3g 2.9
 hooks.php         513      285  55% 15-09-11 10:57   .....A   4029E30E m3g 2.9
 index.html        123      107  86% 15-09-11 10:57   .....A   E8DFAEB4 m3g 2.9
 ...
 config              0        0   0% 18-01-13 14:53   .D....   00000000 m0  2.0
 ...
 application         0        0   0% 18-01-13 14:53   .D....   00000000 m0  2.0
 ...

那么,考虑到这一点,并且考虑到该unrar程序是在 Linux 系统上运行的,为什么它会创建这些奇怪的文件名?我该怎么办?

答案1

我不知道解决方案unrar本身,但如果你可以运行vidir如果您设法将存档内容解压为平面结构目录,那么您可以尝试将其转换为目录树:

# cd to the directory
find . | sort | vidir -

这将打开您的文本编辑器。使用其功能将每个内容替换\/并保存文件而不更改其路径(这是一个临时文件)。vidir将文件和目录移动到新路径,从而创建所需的目录树。

笔记:

  • 不支持文件名中的花哨字符,vidir期望使用标准换行符作为条目分隔符的文本输入(它不适用于find . -print0sort -z)。
  • 我过去常常sort确保代表目录的每一行都位于其内容之前。这很重要,因为vidir在将对象移动到新路径时会创建丢失的目录。稍后移动原始目录会产生可通过~后缀解决的名称冲突,您不希望出现这种情况。您希望先移动目录,然后再移动其内容,因此sort
  • 设置$EDITORvidir使用您选择的文本编辑器(例如EDITOR=vi vidir)。
  • 您可以尝试实验方法我的其他答案自动替换字符,无需手动在文本编辑器中操作。对于您的情况,命令将是:

    find . | sort | EDITOR='sed -i s|\\|/|g' vidir -
    

相关内容