![使用并行将许多目录拆分为子目录](https://linux22.com/image/122328/%E4%BD%BF%E7%94%A8%E5%B9%B6%E8%A1%8C%E5%B0%86%E8%AE%B8%E5%A4%9A%E7%9B%AE%E5%BD%95%E6%8B%86%E5%88%86%E4%B8%BA%E5%AD%90%E7%9B%AE%E5%BD%95.png)
我想用来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 个父目录之间分配(移动)所有目录-n100000
100000
-每个命令行最多使用参数(目录名){#}
- 要运行的作业的序列号。该替换字符串将被正在运行的作业的序列号替换::: arguments
- 使用arguments
命令行作为输入源而不是 stdin(标准输入)
要处理按修改时间排序的目录(目录名) - 使用以下管道:
ls -dtr * | parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}'