如何使用存档名称作为文件夹名称,以多线程方式将多个 7z 存档提取到它们自己的文件夹中?

如何使用存档名称作为文件夹名称,以多线程方式将多个 7z 存档提取到它们自己的文件夹中?

要将所有 7z 存档提取到自己的文件夹中,使用存档名称作为文件夹名称,我运行以下命令:

7z x "*.7z" -o*

例如,如果有两个文件a.7zb.7z,则将创建文件夹a和,它们将分别包含和的内容(保持目录结构)。ba.7zb.7z

有时,我有很多 7z 档案,我想使用多核来提取它们。我读了这个回答经过阿乔姆·S·塔什基诺夫:

7z解压是单线程的,这是压缩格式的限制

因此,我正在考虑使用parallel,因为就我而言,我有多个 7z 存档。

我试过:

parallel -j4 '7z x {} -o{}' ::: *.7z

但是,如果我们返回到包含两个文件a.7z和 的示例b.7z,该命令将尝试将两个文件a.7z和提取b.7z到文件夹a.7zb.7z而不是ab,这将使执行崩溃,因为a.7zb.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替换字符串。{.}

相关内容