mkdir while true 循环在 406 个文件夹处停止

mkdir while true 循环在 406 个文件夹处停止

有人能解释为什么我的脚本在 406 个文件夹处停止创建文件夹并告诉我一种让它正常工作的方法吗?

#!/bin/bash
rm -rf infinite2
while true  
do

mkdir infinite2
cd ./infinite2
mkdir infinite1
cd ./infinite1

done

我花了几天的时间试图弄清楚这一点,但找不到它不起作用的原因。

答案1

在您最初的问题中,您尝试创建如下文件层次结构:

.
├── infinite2
│   ├── infinite1
...
│ (endless level deep)  ├── infinite2

当“深度”达到第 406 个“级别”时,脚本开始出错。没有已知的文件系统可以容纳您想要的那么多级别的子目录。

但是,在您的评论中,您似乎想要这样的目录层次结构:

.
├── dir000000001
├── dir000000002
...
├── dir124999999
└── dir125000000

尽管有可能创造如此巨大的数量单层使用如下脚本的目录下的子目录:

#!/bin/bash
let i=0
while (( i < 125000 )) ; do
  mkdir $(printf "dir%06d" $i){000..999}
  let i++
done

这将是非常非常非常(我说得够多了非常?) 的创建和使用效率低下。我曾是可以通过创建超过 200 万个目录来测试此脚本;但是 1.25 亿个目录太多了。

一个更好的选择是创建一个三级结构,每级包含一千个子目录,层次结构如下:

.
├── dir000
│   ├── 000
│   │   ├── 000
│   │   ├── 001
│   │   ├── 002
...
│   │   └── 999
│   ├── 001
│   │   ├── 000
│   │   ├── 001
...
│   │   └── 999
...
│   ├── 999
│   │   ├── 000
...
│   │   └── 999
...
├── dir124
│   ├── 000
...
│   ├── 999
│   │   ├── 000
...
        └── 999

可以使用以下脚本来创建这些:

#!/bin/bash
let i=0
while (( i < 125000 )) ; do
  let a=i/1000
  let b=i%1000
  mkdir -p $(printf "dir%03d/%03d/\n" $a $b){000..999}
  let i++
done

即使在这种情况下,非常非常非常使用这么多目录很困难。

另一个问题是,你可能很容易用完索引节点在您的文件系统中:您可能会收到臭名昭著的No space left on device错误,而您当前的文件系统有存储空间,但没有剩余的 inode 空间来创建新文件或目录。请在运行上述脚本之前检查命令输出IFree中的列。df -i .

所以,我再说一遍,我认为这是典型的XY问题这需要一种完全不同的方法。

相关内容