我正在将 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 . -print0
或sort -z
)。 - 我过去常常
sort
确保代表目录的每一行都位于其内容之前。这很重要,因为vidir
在将对象移动到新路径时会创建丢失的目录。稍后移动原始目录会产生可通过~
后缀解决的名称冲突,您不希望出现这种情况。您希望先移动目录,然后再移动其内容,因此sort
。 - 设置
$EDITOR
为vidir
使用您选择的文本编辑器(例如EDITOR=vi vidir
)。 您可以尝试实验方法我的其他答案自动替换字符,无需手动在文本编辑器中操作。对于您的情况,命令将是:
find . | sort | EDITOR='sed -i s|\\|/|g' vidir -