如何创建异常数量的子目录?

如何创建异常数量的子目录?

我想创建 1000x1000x1000x1000x1000 等目录,但是像mkdir -p {1..1000}/{1..1000}/{1..1000}/{1..1000}但是很多论点错误或者只是无限地消耗我的 RAM...我该如何正确地做?

答案1

使用嵌套for循环应该可以工作。

for i in {1..1000}
do
    for j in {1..1000}
    do
        for k in {1..1000}
        do
            for m in {1..1000}
            do
                mkdir -p $i/$j/$k/$m
            done
        done
    done
done

可能有更好/更快的方法来做到这一点(花了整整 10 秒钟来创建{1..10}文件夹,深度为 4 级,在我测试的低端 x86 机器上),但是这个应该即使对于大量目录也能工作,因为每次执行最多只创建 4 个目录mkdir

此语法不适用于3.0 之前的版本,但您可以改用for i in $(seq 1 1000)for (( i=1; i<=1000; i++ ))

其他背景信息,如果你想知道为什么mkdir -p {1..1000}/{1..1000}/{1..1000}/{1..1000}会产生“参数太多”或内存错误——当你使用该语法时,shell 会扩展参数列表将其传递给命令。

例如echo {1..10}/{1..10}返回这个(100 个参数):

1/1 1/2 1/3 1/4 1/5 1/6 1/7 1/8 1/9 1/10 2/1 2/2 2/3 2/4 2/5 2/6 2/7 2/8 2/9 2/10 3/1 3/2 3/3 3/4 3/5 3/6 3/7 3/8 3/9 3/10 4/1 4/2 4/3 4/4 4/5 4/6 4/7 4/8 4/9 4/10 5/1 5/2 5/3 5/4 5/5 5/6 5/7 5/8 5/9 5/10 6/1 6/2 6/3 6/4 6/5 6/6 6/7 6/8 6/9 6/10 7/1 7/2 7/3 7/4 7/5 7/6 7/7 7/8 7/9 7/10 8/1 8/2 8/3 8/4 8/5 8/6 8/7 8/8 8/9 8/10 9/1 9/2 9/3 9/4 9/5 9/6 9/7 9/8 9/9 9/10 10/1 10/2 10/3 10/4 10/5 10/6 10/7 10/8 10/9 10/10

...因此,有了四级目录结构(如示例所示),你就可以有效地通过1000*1000*1000*1000 =1万亿参数mkdir

在我的系统上,默认配置允许超过 200 万个参数 字节在参数列表中;您可以使用 来检查getconf ARG_MAX。由于每个参数至少占用 3 个字节 ( 1/1),因此在传递 ~700,000 个参数时会遇到限制。

相关内容