Edw*_*ard 1 python bash shell perl command-line
我有一个目录,大约有250万个文件,超过70 GB.
我想将其拆分为子目录,每个子目录中包含1000个文件.
这是我尝试过的命令:
i=0; for f in *; do d=dir_$(printf %03d $((i/1000+1))); mkdir -p $d; mv "$f" $d; let i++; done
Run Code Online (Sandbox Code Playgroud)
这个命令对我来说很小,但我可以让它在这个目录上运行几个小时,它似乎没有做任何事情.
我打算通过命令行以任何方式执行此操作:perl,python等.无论如何最快完成此操作...
我怀疑,如果你检查过,你会注意到你的程序实际上正在移动文件,尽管速度很慢.启动程序相当昂贵(至少与进行系统调用相比),每个文件执行三到四次!因此,以下应该快得多:
perl -e'
my $base_dir_qfn = ".";
my $i = 0;
my $dir;
opendir(my $dh, $base_dir_qfn)
or die("Can'\''t open dir \"$base_dir_qfn\": $!\n");
while (defined( my $fn = readdir($dh) )) {
next if $fn =~ /^(?:\.\.?|dir_\d+)\z/;
my $qfn = "$base_dir_qfn/$fn";
if ($i % 1000 == 0) {
$dir_qfn = sprintf("%s/dir_%03d", $base_dir_qfn, int($i/1000)+1);
mkdir($dir_qfn)
or die("Can'\''t make directory \"$dir_qfn\": $!\n");
}
rename($qfn, "$dir_qfn/$fn")
or do {
warn("Can'\''t move \"$qfn\" into \"$dir_qfn\": $!\n");
next;
};
++$i;
}
'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1623 次 |
最近记录: |