我想使用该truncate
命令创建大量小文件进行测试。我用少量文件(100 个)尝试了该命令,它起作用了。当我将数字更改为1000000时,它会报告错误:
root:[~/data]# truncate -s 1k {1..100}
root:[~/data]# rm -rf *
root:[~/data]# truncate -s 1k {1..1000000}
-bash: /usr/bin/truncate: Argument list too long
root:[~/data]#
我该如何解决?我有一种xargs
可以使用的感觉,但我无法让它发挥作用。
你可以做
(这应该与不受命令行长度限制的内置 echo 的 shell 一起使用。
xargs
默认情况下还会在任何空格上拆分输入,但这并不重要。)以上可能会使用大量内存,因此
seq
在 mosvy 的评论中使用 like 可能会更好:我通常使用一个循环(这从
000000
, not开始1
,并且所有名称中都有前导零):在单个目录中拥有一百万个文件可能会很慢,因此除非您只是在测试,否则最好将它们分散到子目录中,例如:
请注意,如果您无法创建文件,因为它们不适合一个命令行并以某种方式解决该问题,您可能无法使用其中
rm -f *
任何一个来删除它们。您需要递归删除整个树,或者执行类似find -maxdepth 1 -type f -delete
.只需在@ilkkachu 的出色答案中添加注释即可解释逻辑。命令
truncate
使用一百万个参数加上三个 (truncate
(argv[0]
)-s
和) 的调用,这远远超过了大多数系统上系统调用1k
的参数和环境变量的累积数量和大小的默认限制。execve()
因此出现“参数列表太长”错误。相反,建议的解决方案
只需使用尽可能多的参数(旁边,并且在每次调用中重复)尽可能多地运行
truncate
(通过) ,以避免系统调用的限制。xargs
truncate
-s
1k
execve()