2017-04-12 5 views
2

나는 최근에 많은 작은 하위 폴더와 파일을 포함하는 더 큰 디렉토리에서 작은 txt 파일을 많이 포함하는 하위 폴더를 끌어 올 수있는 작은 스크립트를 작성했습니다.복사 항목 속도 저하 - 5500 개의 파일을 필터링하고 복사하려면 40 분이 필요합니까?

외부 하드 디스크의 로컬 드라이브에 txt 파일이 들어있는 ~ 17GB 상당의 폴더 (~ 5,500 개의 파일이 포함 된 100 개 폴더)가 모두 복사되었습니다. 연결은 USB 2.0이었다.

이 작업을 수행하는 데 약 40 분이 걸렸습니다! 왜 이렇게 오래 걸렸을까요?

내 코드 또는 오래된 데이터 연결의 속도 저하와 관련하여 더 많은 오버 헤드가 있었습니까? 앞으로 어떤 단축키를 사용할 수 있습니까? robocopy는 복사 항목보다 본질적으로 빠릅니까? 그렇다면 왜?

$mainDir = Get-ChildItem 'E:\Some Big Directory\' -Recurse | Where {$_.Mode -match 'd'} | % {$_.FullName} 

ForEach($dir in $mainDir){ 
    if($dir.ToString() -match 'SubfoldersIWant'){ 
     Copy-Item -Path $($dir + '\TheActualFolderIWant\*') -Destination 'C:\somwhere' -Recurse 
    } 
} 

폴더 구조는 (아래 크기 WAY)를 다음과 같이 다소이다 :

Get-ChildItem 'E:\Some Big Directory' -Directory -Recurse | Where {$_.FullName -match 'SubfoldersIWant'} | Copy-Item -Destination 'C:\somwhere' -Recurse 

이 방법, 필터링이 훨씬 빠릅니다 :

 
Some Big Directory 
    -SubfoldersIWant1 
    -subFolderIDontwant 
     -random.txt 
    -subFoldersIWant 
     -*.txt 
    -rando.jpg 
    -I dont want this folder 
    -random junk 
    -SubfoldersIWant2 
    -subFolderIDontwant 
     -random.txt 
    -subFoldersIWant 
     -*.txt 
    -rando.jpg 
    -dontwantthiseither.jpg 
+1

첫 줄에'% {$ _. fullname}'을'select -expand fullname'으로 대체했습니다. – Vesper

+0

USB2는 USB3보다 10 배 느리므로 자주 업그레이드 할 계획이라면 드라이브 업그레이드에 대해 생각해보십시오. –

+0

@ JamesC. 재미있게도 드라이브는 3.0이지만 현재 워크 스테이션은 2.0 만있는 오래된 델입니다 : ( – Christopher

답변

1

당신이 한 줄을 사용할 수 있습니다. 하지만 병목 현상이 데이터 전송 속도 인 것 같기 때문에 솔직히 큰 영향을 미치지는 않습니다.

+2

대신에 -match를 사용하는 것이 좋습니다. '-eq' OP 목록에 "SubfoldersIWant2"와 "SubfoldersIWant"가 있습니다. –

+0

잠시 후에 다시 시도해 보겠습니다. 더 빠른지 알려 줍시다! 답변을 받아 들일 수 없습니다 (병목 현상은 2.0입니다) – Christopher

+0

@JamesC .' -match'는 정규식으로 경로를 필터링하고 싶을 때 유용합니다.이 경우'Where {$ _. Mode -match 'd'}'행에서 질문을 볼 수 있습니다. 명확하게'-mach'는 단지 동등한 것을 의미한다고 생각했지만, 근본적으로 맞습니다. –