好的,所以我在一个文件夹中有650万个图像,我需要尽快让它们移动。我将把它们移动到自己的文件夹结构中,但首先我必须将它们移出这台服务器。
我尝试了rsync和cp以及各种其他工具,但它们总是会出错。所以我写了一个perl脚本来以更直接的方式提取信息。使用opendir并让它计算所有文件是完美的。它可以在大约10秒内统计它们。现在我尝试将我的脚本再增加一个档次并让它实际移动文件,我得到错误“文件太大”。这必定是某种错误的错误,因为文件本身都很小。
#!/usr/bin/perl
#############################################
# CopyFilesLite
# Russell Perkins
# 7/12/2010
#
# Tool is used to copy millions of files
# while using as little memory as possible.
#############################################
use strict;
use warnings;
use File::Copy;
#dir1, dir2 passed from command line
my $dir1 = shift;
my $dir2 = shift;
#Varibles to keep count of things
my $count = 0;
my $cnt_FileExsists = 0;
my $cnt_FileCopied = 0;
#simple error checking and validation
die "Usage: $0 directory1 directory2\n" unless defined $dir2;
die "Not a directory: $dir1\n" unless -d $dir1;
die "Not a directory: $dir2\n" unless -d $dir2;
opendir DIR, "$dir1" or die "Could not open $dir1: $!\n";
while (my $file = readdir DIR){
if (-e $dir2 .'/' . $file){
#print $file . " exsists in " . $dir2 . "\n"; #debuging
$cnt_FileExsists++;
}else{
copy($dir1 . '/' . $file,$dir2 . '/' . $file) or die "Copy failed: $!";
$cnt_FileCopied++;
#print $file . " does not exsists in " . $dir2 . "\n"; #debuging
}
$count++;
}
closedir DIR;
#ToDo: Clean up output.
print "Total files: $count\nFiles not copied: $cnt_FileExsists\nFiles Copied: $cnt_FileCopied\n\n";
你们有没有遇到过这个?是什么导致这种情况以及如何解决?
答案 0 :(得分:1)
关于你的错误处理代码,你能不能把or die "Copy failed: $!";
更改为'或死'复制失败:'$ dir1 / $ file'到'$ dir2 / $ file':$!“;' ?
然后它应该告诉你错误发生在哪里。
然后检查2件事 -
1)每次在同一个文件上都会失败吗?
2)那个文件有点特别吗?奇怪的名字?不寻常的尺寸?不是常规文件?根本不是文件(理论上是另一个答案)?
答案 1 :(得分:0)
我不确定这是否与您的问题有关,但readdir将返回所有目录内容的列表,包括子目录(如果存在)以及当前(。)和父目录(..)on许多操作系统。您可能正在尝试复制目录和文件。 以下内容不会尝试复制任何目录:
while (my $file = readdir DIR){
next if -d "$dir1/$file";
答案 2 :(得分:0)
似乎这是我安装到的服务器的nfs挂载的问题。我连接了一个usb驱动器,文件正以极快的速度复制......如果你认为usb 2是极端的。
答案 3 :(得分:0)
一个文件夹中的650万个图像非常极端,只是为了读取目录而在机器上加载,无论是shell还是Perl。这是一个很大的文件夹结构。
我知道你现在在Perl中追逐一个解决方案,但是当你从shell处理那么多文件时,你会想要利用xargs命令。通过将文件分组为可管理的块,它可以提供很多帮助。 http://en.wikipedia.org/wiki/Xargs
答案 4 :(得分:0)
也许您发送数据的分区文件系统不支持非常大的数据。