2010-07-12 67 views
0

好吧,我有一個文件夾中有650萬個圖像,我需要讓他們儘快移動。我將把它們移到他們自己的文件夾結構中,但首先我必須讓它們從這個服務器上移開。「複製失敗:文件太大」perl錯誤

我試過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

似乎這是一個問題,無論是我的NFS服務器掛載到它的安裝。我連接了一個USB驅動器,並且文件以極高的速度複製......如果您將USB 2視爲極端。

+0

nfs對可以在目錄中的最大文件有一個硬限制。 – 2010-07-15 19:24:37

0

我不確定這是否與您的問題有關,但readdir將返回所有目錄內容的列表,包括子目錄(如果存在)以及許多操作系統上的當前(。)和父目錄(..) 。您可能試圖複製目錄以及文件。 下面將不會試圖複製任何目錄:

while (my $file = readdir DIR){ 
    next if -d "$dir1/$file"; 
+0

它確實看到了。和..但由於他們在兩個地點它跳過他們。它只複製dir1但不包含dir2的文件 – 2010-07-12 19:34:44

+1

您是否仍然收到我的代碼的複製錯誤? – toolic 2010-07-12 19:46:20

1

在您的錯誤處理代碼,請你改變or die "Copy failed: $!";到「或死「複製失敗:‘$ DIR1/$文件’到「$ DIR2/$文件':$!「;' ?

然後它應該告訴你錯誤發生在哪裏。

然後檢查兩件事情 -

1)是否失敗,在同一文件中的每個時間?

2)這個文件有點特別嗎?奇怪的名字?不尋常的大小?不是一個普通的文件?根本不是文件(作爲其他答案的理論)?

0

在一個文件夾中有650萬張圖像是非常極端的,只是爲了讀取一個目錄,而不管它是在shell還是Perl。這是一個大文件夾結構。

我知道你現在在追逐Perl的解決方案,但是在處理來自shell的許多文件時,你會想利用xargs命令。通過將文件分組成可管理的塊,它可以提供很多幫助。 http://en.wikipedia.org/wiki/Xargs

0

也許您發送數據的分區文件系統不支持非常大的數據。

相關問題