/usr/bin/truncate:参数列表太长

/usr/bin/truncate:参数列表太长

我想使用该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,但我无法让它发挥作用。

答案1

你可以做

echo {1..1000000} | xargs truncate -s 1k

(这应该与带有内置回显的 shell 一起使用,不受命令行长度限制。xargs默认情况下还会在任何空格上分割输入,但这在这里并不重要。)

上面的代码可能会使用大量的内存,因此seq在 mosvy 的评论中使用 like 可能会更好:

seq 1 1000000 | xargs truncate -s 1k

不过,我通常使用循环(这从000000, not开始1,并且所有名称中都有前导零):

for i in {000..999}; do
    touch "$i"{000..999}
done

在一个目录中拥有一百万个文件可能会很慢,因此除非您只是进行测试,否则最好将它们分散到子目录中,例如:

for i in {000..999}; do
    mkdir "$i"
    touch "$i"/{000..999}
done

请注意,如果您无法创建这些文件,因为它们不适合一个命令行并以某种方式解决该问题,那么您可能无法使用其中rm -f *任何一个来删除它们。您需要递归地删除整棵树,或者执行类似的操作find -maxdepth 1 -type f -delete

答案2

只需在 @ilkkachu 的优秀答案中添加注释来解释逻辑即可。命令

truncate -s 1k {1..1000000}

打电话truncate一百万参数加上三个 ( truncate( argv[0])-s1k),这远远超过了大多数系统上系统调用的参数和环境变量的累积数量和大小的默认限制execve()。因此“参数列表太长”错误。

相反,建议的解决方案

seq 1 1000000 | xargs truncate -s 1k

只是根据需要运行truncate(通过xargs)尽可能多的参数(除了truncate-s并且1k在每次调用中重复)尽可能多,以避免系统execve()调用的限制。

相关内容