创建多个文件的有效方法

Rah*_*til 7 shell files touch

我一直在测试使用最大 inode 的查找目录,并且在测试时我已经运行

touch test_{1..1391803}.txt
Run Code Online (Sandbox Code Playgroud)

但它给了我错误"-bash: /usr/bin/touch: Argument list too long",现在我在命令下运行,但似乎需要 Hugh 时间

ruby -e '1.upto(1391803) { |n| %x( touch "test_#{n}.txt" ) }'
Run Code Online (Sandbox Code Playgroud)

所以问题是:有没有办法在短时间内创建多个文件?我应该每个循环触摸 1 个 lac 文件还是更好的方法?

测试结果 :

1号

[root@dc1 inode_test]# time seq 343409 | xargs touch

real    0m7.760s
user    0m0.525s
sys     0m4.385s
Run Code Online (Sandbox Code Playgroud)

2号

[root@test-server inode_test]# time echo 'for (i=1;i<=343409;i++) i' | bc | xargs touch

real    0m8.781s
user    0m0.722s
sys     0m4.997s
Run Code Online (Sandbox Code Playgroud)

3号

[root@test-server inode_test]# time printf '%s ' {1..343409} | xargs touch

real    0m8.913s
user    0m1.144s
sys     0m4.541s
Run Code Online (Sandbox Code Playgroud)

4号

[root@test-server inode_test]# time awk 'BEGIN {for (i=1; i<=343409; i++) {printf "" >> i; close(i)}}'

real    0m12.185s
user    0m2.005s
sys     0m6.057s
Run Code Online (Sandbox Code Playgroud)

5号

[root@test-server inode_test]# time ruby -e '1.upto(343409) { |n| File.open("#{n}", "w") {} }'

real    0m12.650s
user    0m3.017s
sys     0m4.878s
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 12

限制是执行命令时参数的大小。因此,选项是执行带有较少参数的命令,例如xargs运行较小的批处理,增加限制(ulimit -s 100000在 Linux 上),不执行任何操作(在 shell 中执行所有操作),或在创建列表的工具中构建列表文件。

zsh, ksh93, bash:

printf '%s ' {1..1391803} | xargs touch
Run Code Online (Sandbox Code Playgroud)

printf是内置的,所以没有exec,所以没有达到限制。xargs拆分传递给的参数列表touch以避免突破限制。这仍然不是很有效,因为 shell 必须首先创建整个列表(特别是用 慢bash),将它存储在内存中,然后打印它。

seq 1391803 | xargs touch
Run Code Online (Sandbox Code Playgroud)

(假设你有一个seq命令)会更有效率。

for ((i=1; i<=1391803; i++)); do : >> "$i"; done
Run Code Online (Sandbox Code Playgroud)

一切都在shell中完成,内存中没有存储大列表。应该是相对有效的,除了bash.

POSIXly:

i=1; while [ "$i" -le 1391803 ]; do : >> "$i"; i=$(($i + 1)); done

echo 'for (i=1;i<=1391803;i++) i' | bc | xargs touch

awk 'BEGIN {for (i=1; i<=1391803; i++) {printf "" >> i; close(i)}}'
Run Code Online (Sandbox Code Playgroud)