您可以通过几个循环运行它,这应该可以解决问题(至少对于文件名的数字部分)。我认为作为单线这样做是过于乐观了。
#! /bin/bash
for hundreds in {0..99}
do
min=$(($hundreds*100+1))
max=$(($hundreds*100+100))
current_dir="$min-$max"
mkdir $current_dir
for ones_tens in {1..100}
do
current_file="$(($hundreds*100+$ones_tens)).html"
#touch $current_file
mv $current_file $current_dir
done
done
我通过首先注释掉和取消注释来进行mkdir $current_dir
性能mv $current_file $current_dir
测试touch $current_file
。这创建了 10000 个文件(目标 1000000 个文件的百分之一)。创建文件后,我恢复为编写的脚本:
$ time bash /tmp/test.bash 2>&1
real 0m27.700s
user 0m26.426s
sys 0m17.653s
只要您不跨文件系统移动文件,每个mv
命令的时间应该是恒定的,因此您应该会看到相似或更好的性能。将其扩展到一百万个文件将给您大约 27700 秒,即 46 分钟。有多种优化途径,例如在一个命令中移动给定目录的所有文件,或删除内部 for 循环。
执行 'wget' 来抓取一百万个文件将花费比这更长的时间,并且几乎可以肯定需要一些优化;仅在 http 标头中保留带宽就会将运行时间缩短数小时。我不认为 shell 脚本可能是该工作的正确工具。在 cpan 上使用诸如 WWW::Curl 之类的库将更容易优化。