为什么 unrar 不能展开这个表达式?

为什么 unrar 不能展开这个表达式?

我在同一目录中有三个 RAR 文件:file1.rarfile2.rarfile3.rar.我想使用扩展通过一个命令来提取它们,请记住星号必须在 、 、 等参数unrarunzip转义7z

我尝试了这个命令:

unrar x file\*rar

结果是:

UNRAR 5.00 beta 8 freeware      Copyright (c) 1993-2013 Alexander Roshal

No files to extract

然而,这个命令有效:

unrar x file\*

这个命令有效:

ls file*rar

其结果是:

file1.rar file2.rar file3.rar

那么为什么第一个命令不起作用呢?

答案1

unrar x '*.rar' 

这对我有用,我也遇到了同样的问题。

如果我省略 ' unrar 将尝试在同一命令行上添加所有文件

例如:我有 1.rar 2.rar 3.rar 如果有的话

unrar x *.rar

传递到 linux 的命令将是

unrar x 1.rar  2.rar 3.rar 

并导致错误,但如果我像这样使用 '

unrar x '*.rar' 

传递的命令将是

unrar x 1.rar
unrar x 2.rar
.......

答案2

它在 5.2.7(较新版本)中也不起作用。我建议尝试一下unrar x file\*.rar,记下前面的点rar。至少在 5.2.7 中,代码路径略有不同,并且它在 5.2.7 中有效。

为什么?好吧,在浏览了 unrar 的源代码几分钟后(match.cpp如果你想尝试的话,请看一下!),我可以轻松地说“因为 Alexander Roshal 真的,真的,真的应该使用glob(3)“代替”。他为什么不呢?可能是因为它在 Windows 上不可用,而 AFAIK rar 正是在 Windows 上使用的。

在 Windows 上,扩展名很特殊,代码似乎unrar将其视为文件名的一部分,而不是真正的文件名的一部分 - 一个简单的最终尾随*将匹配一个,但*中间的 a 则不会。不确定这在 Windows 上是否是预期的行为,但在 Unix 上肯定不是。


解决方法

处理这样的破碎的明智方法可能是这样的:

for f in file*rar; do
    unrar x "$f"
done

让 shell 展开 glob 并一次解压缩一个文件。只是希望你的文件*名称中没有包含...


我一开始说它在 5.2.7 中有效,这是错误的:我在测试时丢失了反斜杠......

答案3

当您输入时unrar x file\*rar,unrar 程序会接收文字字符串file*rar。输入 可能更容易unrar x file*rar,这将导致您的 shell 扩展模式(unrar 将接收与模式匹配的文件列表)。

现在,为什么egunrar x file\*rar不起作用,而egunrar x file\*.rar却起作用呢?我的猜测是,它unrar包含自己的代码来进行模式扩展,在 shell 不执行此操作的系统上运行,并且规则与 Unix 上的规则不同。如果我没记错的话,这符合 MS-DOS 上的规则,哪里*rar不是匹配名称以 . 结尾的文件.rar

相关内容