2010-07-12 4 views
0

좋아요, 그래서 폴더에 650 만개의 이미지가 있습니다. 나는 그것들을 그들 자신의 폴더 구조로 옮기 겠지만, 먼저 나는이 서버에서 움직여야한다.perl에서 "복사 실패 : 파일이 너무 큼"오류

나는 rsync와 cp 및 모든 종류의 다른 도구를 시도했지만 항상 오류가 발생합니다. 그래서 저는 좀 더 직접적인 방법으로 정보를 가져 오기위한 펄 스크립트를 작성했습니다. opendir을 사용하고 모든 파일을 계산하도록하는 것은 완벽합니다. 그것은 약 10 초 안에 모두를 셀 수 있습니다. 이제 스크립트를 한 단계 더 나아가 실제로 파일을 옮기고 "File too large"오류가 발생합니다. 파일 자체가 모두 상당히 작기 때문에 일종의 잘못된 오류 여야합니다.

#!/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에는 디렉토리에있을 수있는 최대 파일에 대한 하드 제한이 있습니다. –

0

이 문제가 귀하의 문제와 관련이 있는지 확실하지 않지만 readdir은 많은 운영 체제에서 하위 디렉토리 (있는 경우)와 현재 (.) 및 상위 디렉토리 (..)를 포함한 모든 디렉토리 내용의 목록을 반환합니다 . 파일뿐만 아니라 디렉토리를 복사하려고 시도했을 수 있습니다. 다음은 어떤 디렉토리에 복사하려고 시도하지 않습니다 : 당신이 or die "Copy failed: $!";을 변경하시기 바랍니다 수, 당신의 오류 처리 코드에

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

두 위치에 있기 때문에 건너 뜁니다. dir1에는 있지만 dir2에는없는 파일 만 복사합니다. –

+1

코드에 오류가 있습니까? – toolic

1

를 '또는 사망 "복사 실패 :'$의 DIR1/$ 파일을 $ DIR2/$ '에' file ': $! ";' ?

그런 다음 오류가 발생한 위치를 알려야합니다.

1)는 같은 파일에 매번 실패 하는가 -

은 다음 2 가지를 확인?

2) 그 파일은 어떻게 든 특별합니까? 이상한 이름? 특이한 크기? 정규 파일이 아닌가요? 전혀 파일이 아닙니다 (다른 대답이 이론화 된 것처럼)?

0

하나의 폴더에있는 650 만 개의 이미지는 매우 극단적이며 쉘 또는 Perl에 관계없이 디렉토리를 읽는 것만으로 컴퓨터에 부하가 걸립니다. 그것은 하나의 큰 폴더 구조입니다.

당신이 펄에서 해결책을 찾고 있다는 것을 알고 있지만 쉘에서 그 많은 파일을 다룰 때 xargs 명령을 이용하고 싶을 것입니다. 파일을 관리 가능한 덩어리로 그룹화하면 많은 도움이됩니다. http://en.wikipedia.org/wiki/Xargs

0

어쩌면 파티션의 파일 시스템은 매우 큰 데이터를 지원하지 않기 위해 데이터를 보냅니다.