2017-04-12 7 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倍遅いので、頻繁にこれを行う予定がある場合は、ドライブのアップグレードについて考えてみてください。 @JamesC。 –

+0

おかげで十分なドライブは3.0ですが、私の現在のワークステーションは2.0しかない古いdellです:( – Christopher

答えて

1

あなたはこの1行を使用することができます。しかし、あなたのボトルネックはデータ転送速度のように思えるので、正直言って大きな効果は期待できません。

+2

代わりに '-match'を使いたいかもしれません。 '-eq'はOPリストに" SubfoldersIWant2 "と" SubfoldersIWant "のように表示されます –

+0

私はこれを一瞬で試してみて、それがもっと速いかどうかを知らせます!答えが受け入れられません(ボトルネックはusb 2.0です) – Christopher

+0

@JamesC。 '-match'は、正規表現を使ってパスをフィルタリングしたい場合に便利です。この場合、' Where {$ _。Mode -match 'd'} 'という行に質問があります明らかに '-mach'とは単に等しいことを意味しますが、本質的に正しいので、私は訂正します:) –

関連する問題