要将所有 7z 存档提取到自己的文件夹中,使用存档名称作为文件夹名称,我运行以下命令:
7z x "*.7z" -o*
例如,如果有两个文件a.7z
和b.7z
,则将创建文件夹a
和,它们将分别包含和的内容(保持目录结构)。b
a.7z
b.7z
有时,我有很多 7z 档案,我想使用多核来提取它们。我读了这个回答经过阿乔姆·S·塔什基诺夫:
7z解压是单线程的,这是压缩格式的限制
因此,我正在考虑使用parallel
,因为就我而言,我有多个 7z 存档。
我试过:
parallel -j4 '7z x {} -o{}' ::: *.7z
但是,如果我们返回到包含两个文件a.7z
和 的示例b.7z
,该命令将尝试将两个文件a.7z
和提取b.7z
到文件夹a.7z
和b.7z
而不是a
和b
,这将使执行崩溃,因为a.7z
和b.7z
已经被获取并且是文件。我该如何解决这个问题?我想要两个文件夹,a
并且b
.
如果这很重要的话,我使用 Ubuntu。
答案1
parallel
{.}
如果您指定而不是指定以下内容,则会删除扩展名{}
:
parallel -j4 '7z x {} -o{.}' ::: *.7z
答案2
*
只是关于in选项的旁注-o{dir_path}
。该文档指出
{dir_path}
这是目标目录路径 [...] 如果您*
在 中指定{dir_path}
,7-Zip 会将该*
字符替换为存档名称。
初始命令的正确语法是
7z x \*.7z -o\*
也就是说,第二个*
也必须转义,否则 shell 将尝试扩展它。您可能bash
在不使用该nullglob
选项的情况下使用,这就是它起作用的原因(它找不到匹配项,因此将其字面传递给7z
)...
gnu parallel
现在,要通过您可以使用*
(转义,正如我上面所说的)运行该命令:
parallel -j4 '7z x {} -o\*' ::: *.7z
或者像斯蒂芬的回答一样删除*
并使用parallel
替换字符串。{.}