将大目录拆分为子目录

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等.无论如何最快完成此操作...

ike*_*ami 8

我怀疑,如果你检查过,你会注意到你的程序实际上正在移动文件,尽管速度很慢.启动程序相当昂贵(至少与进行系统调用相比),每个文件执行三到四次!因此,以下应该快得多:

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)