我在同一目录中有三个 RAR 文件:file1.rar
、file2.rar
和file3.rar
.我想使用扩展通过一个命令来提取它们,请记住星号必须在 、 、 等参数unrar
中unzip
转义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
。