在bash的5000个目录中创建5000000000个空文件的最快方法

在bash的5000个目录中创建5000000000个空文件的最快方法,bash,loops,file,file-io,Bash,Loops,File,File Io,所以我需要在linux驱动器上创建5000000000个文件-空文件。实现这一目标的最快/最有效的方法是什么 我目前正在尝试的是: 用于/xfs/*/中的目录;do seq 1000000 | xargs-n1-I%bash-c'touch'$dir/file%';完成 这是“工作”,尽管速度很慢。(在5000个目录中创建1000000个文件) 有没有更好的方法来实现这一点?(没有进入参数列表太长问题) TIAtouch是一个外部程序,您必须启动5000000000次。您还运行了seq5000次

所以我需要在linux驱动器上创建5000000000个文件-空文件。实现这一目标的最快/最有效的方法是什么

我目前正在尝试的是:

用于/xfs/*/中的目录;do seq 1000000 | xargs-n1-I%bash-c'touch'$dir/file%';完成

这是“工作”,尽管速度很慢。(在5000个目录中创建1000000个文件)

有没有更好的方法来实现这一点?(没有进入参数列表太长问题)


TIA

touch
是一个外部程序,您必须启动5000000000次。您还运行了
seq
5000次。两个都不要跑

for dir in /xfs/*/; do
    for ((i=1; i <= 1000000; i++)); do
        : > "$dir/file$i"
    done
done
用于/xfs/*/中的目录;做
对于((i=1;i“$dir/文件$i”
完成
完成

此循环是一个单一的shell命令,不会产生额外的进程;
命令的输出重定向由当前shell中的单个系统调用处理。

代码的最大问题是
xargs-n1-I%bash-c'touch
。对于要创建的每个文件,您都在执行两个进程-第一个
bash
,然后触摸
。生成过程需要时间,一个文件需要两个

下面的可能更快,但我怀疑另一个答案中的纯bash解决方案可能更快。
find
/xfs/
中输出目录列表。然后
seq
输出文件名后缀为数字的目录。然后,结果字符串被传递到
touch

find /xfs/ -mindepth 1 -maxdepth 1 -type d |
xargs -d'\n' -I{} seq -f "{}/file%.0f" 1000000 |
xargs -d'\n' touch

如果您有GNU
xargs
,您可以通过将
-p
添加到最后一个
xargs
来轻松并行执行。这很快,因为它是一个进程,可以立即决定输出是什么,只需创建空文件

for dir in ./*/; do
    split -d -n1000000 /dev/null "$dir/file"
done
我注意到类似的修改时间:

find . -type d | xargs -I{} split -d -n1000000 /dev/null {}/file

出于好奇,您为什么需要这样做?Bash在这里没有任何意义,您可以只使用
xargs-I%touch$dir/file%
获得相同的结果,尽管调用每个文件的
touch
的单独副本(正如上面的
xargs
建议所做的那样)当你关心性能时,这通常是一个坏主意;至少在你的写缓冲区满之前,
xargs-I%bash-c'…%…'
开始新的
/bin/touch
比实际创建文件花费更多的时间。顺便说一句,从安全角度来看,
xargs-I%bash-c'…%…'
通常是一种严重的代码味道我们的值总是数字的——但是如果您在迭代文件名或其他自由格式的内容,您需要担心类似于
$(rm-rf~)'$(rm-rf~)'
的内容被替换为
%
,然后是一个副本或另一个副本(取决于
%
所处的引用上下文类型)在5000个目录中以code.5000000000空文件的形式运行实际上是每个目录1000000个文件。我对文件系统处理此问题的能力表示怀疑,否则它将带来巨大的性能成本。在以后使用这些文件或只是处理这些文件将是一个问题。同时请记住,EXT4有一个问题d每个分区最多有2个文件4294967296,这少于您要创建的5000000000个文件。您还可以只运行
“$dir/file$i”
没有
,但是作为一个内置的,我看不出它会有这样的伤害。我假设创建文件的IO成本比隐式shell命令可能带来的任何轻微内部加速都要小。虽然说实话,出于POSIX的原因,我保留了
,但这与我使用的C风格for循环无关:)。谢谢,这工作得更好。我是新来的,我知道我做得不正确。这工作得更快。如果你并行化内部for loopsTIL,它可能会更快。BSD
seq
实现了
-f
扩展;我假设它是GNUism。(不是那个“扩展”)对于一个根本不是标准定义的命令来说,这是一个有意义的概念)。就我个人而言,我可能会并行化,只对内部循环使用切普纳的答案,而对外部循环使用您的
find
find/xfs/-mindepth 1-maxdepth 1-typed-exec xargs-0-p20bash-c'”$@;do for((I=1;I>“$dir/file$I”;done;done'{}+
——将20调整为本地I/O子系统将承受的任何负载。