4

我想解压缩多个文件,

使用这个答案,我找到了以下命令。

find -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;

如何使用 GNU Parallel 和上述命令解压缩多个文件?


编辑 1:根据用户Mark Setchell的问题

文件在哪里?

所有的 zip 文件通常都在一个目录中。

但是,根据我的假设,即使根据 find 命令中给出的深度递归/非递归,该命令也会找到所有文件。

文件是如何命名的?

abcd_sdfa_fasfasd_dasd14.zip

你通常如何解压缩一个?

unzip abcd_sdfa_fasfasd_dasd14.zip -d abcd_sdfa_fasfasd_dasd14

4

2 回答 2

10

您可以首先使用NULL 分隔文件find-print0选项,然后在 GNU 中使用 NULL 分隔符并行读取并应用解压缩

find . -type f -name '*.zip' -print0 | parallel -0 unzip -d {/.} {}

该部分{/.}应用字符串替换来获取文件的基本名称并删除之前的部分,.如 GNU 并行文档中所见- 请参阅 7. 获取基本名称,并删除最后一个 ( {.}) 或任何 ( {:}) 扩展名您可以进一步设置并行数可以使用-j标志运行的作业。例如-j8-j64

于 2019-12-24T11:10:49.990 回答
1

您也可以+使用-exec. 它在完成parallel后启动find,但也允许您仍然使用-print/ -printf/ -ls/etc。并可能在执行命令之前中止查找:

find . -type f -name '*.zip' -ls -exec parallel unzip -d {.} ::: {} \+

请注意,GNU Parallel 也用于{}指定输入参数。但是,在这种情况下,我们{.}会像您的示例中所示那样剥离扩展名。{}您可以使用-I(例如, using-I@@允许您使用@@而不是)覆盖 GNU Parallel 的替换字符串{}

我建议使用 GNU Parallel 的--dry-run标志或在前面unzip加上 anecho来首先测试命令,看看会执行什么。

于 2021-06-27T02:57:58.600 回答