使用并行将许多目录拆分为子目录

使用并行将许多目录拆分为子目录

我想用来parallel将许多目录拆分为子目录。例如,我有 1 000 000 个包含内容的目录,但对于一个目录来说太多了,所以我想在主目录中创建 10 个目录,并在每个目录中移动 100 000 个原始目录。

我已经尝试过ls -tr|parallel -n100000 mkdir "dir_{#}"\;mv {} "dir_{#}"命令,但它仅将 ~10 000 移动到一个子目录中(有时 ~6200,有时 ~12 500)并创建太多子目录 - 有时比我需要的多 10 倍。当然,我不需要每个子目录中正好有100 000个目录,它可以是101 000或98 500个目录,它应该是100 000范围内的数字

那么,我该如何使用 来做到这一点parallel

答案1

GNUparallel解决方案:

parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}' ::: *

  • j N- 职位数量。并行运行N作业。在您的情况下,我们将运行 10 个作业来在新的 10 个父目录之间分配(移动)所有目录
  • -n100000100000-每个命令行最多使用参数(目录名)
  • {#}- 要运行的作业的序列号。该替换字符串将被正在运行的作业的序列号替换
  • ::: arguments- 使用arguments命令行作为输入源而不是 stdin(标准输入)

要处理按修改时间排序的目录(目录名) - 使用以下管道:

ls -dtr * | parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}'

相关内容