В любом случае, чтобы разделить файлы в папке diff? - PullRequest
0 голосов
/ 20 февраля 2020

У меня более 100 000 файлов в имени папки: A, все файлы изображений либо в формате jpeg, либо в формате jpg со случайными именами файлов, например ab c .jpg, x cc .jpg, bbb.jpeg

Есть ли способ переместить все файлы 100k в папку в следующей структуре:

Любой порядок изображений не имеет значения, просто нужно 5000 pi c в каждой папке под B

Folder B -> Folder 1 (5000 of the jpg files)
            Folder 2 (next 5000 of the jpg files) 
            .
            Folder n (last 5000 remaining of files)

Пакетные файлы или PowerShell не имеют значения, так как долго запускаются в windows или CMD, я просто не могу придумать, как разлить файлы до 5000 в папке.

Любая помощь приветствуется ... Спасибо

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Ниже кода предполагается, что есть папки folder_a и folder_b. Ваши изображения находятся в folder_a, и код переместит эти изображения в folder_b\folder_1\..., folder_b\folder_2\..., folder_b\folder_3\... et c. Измените эти имена каталогов в соответствии с вашими требованиями. Запустите его в folder_a, и он будет работать.

$split_at = 5000
# First, create the directories to store the images
$image_count = Get-ChildItem -File | Measure-Object | Select-Object -ExpandProperty Count
1..[math]::Ceiling($image_count/$split_at) | %{New-Item -Name "folder_$($_)" -ItemType Directory -Path "..\folder_b"}

# Then move the images in batch to the destination directories
$folder_n = 1
while(Test-Path .\*) {
    Get-ChildItem | select -First $split_at | Move-Item -Destination "..\folder_b\folder_$($folder_n)" -Force
    $folder_n++
}

Тесты

Я сравнил свой код с кодом Мануэля Батшинга. Оказывается, мой код работает быстрее. Ниже приведен код тестирования и результат. Здесь я создал 2999 файлов изображений каждый раунд и переместил их с folder_a на folder_b (что находится на том же уровне в файловой системе).

Remove-Item -Path ..\folder_b\* -Force -Recurse
1..2999 | %{New-Item -Name "item $_.jpg"}

Measure-Command {
    $split_at = 43
    # First, create the directories to store the images
    $image_count = Get-ChildItem -File | Measure-Object | Select-Object -ExpandProperty Count
    1..[math]::Ceiling($image_count/$split_at) | %{New-Item -Name "folder_$($_)" -ItemType Directory -Path "..\folder_b"}

    # Then move the images in batch to the destination directories
    $folder_n = 1
    while(Test-Path .\*) {
        Get-ChildItem | select -First $split_at | Move-Item -Destination "..\folder_b\folder_$($folder_n)" -Force
        $folder_n++
    }
}

Remove-Item -Path ..\folder_b\* -Force -Recurse
1..2999 | %{New-Item -Name "item $_.jpg"}

Measure-Command {
    $i = 1
    while (($files = Get-ChildItem *.jpg, *.jpeg).Count -gt 0) 
    {
        $folderPath = "..\folder_b\folder_$($i)"
        New-Item -Type Directory $folderPath
        $files | Select-Object -First 43 | Move-Item -Destination $folderPath
        $i += 1
    }
}

Результат (Мой код):

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 7
Milliseconds      : 632
Ticks             : 76323557
TotalDays         : 8.83374502314815E-05
TotalHours        : 0.00212009880555556
TotalMinutes      : 0.127205928333333
TotalSeconds      : 7.6323557
TotalMilliseconds : 7632.3557

Результат (Мануэль Батшинг):

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 13
Milliseconds      : 961
Ticks             : 139616227
TotalDays         : 0.000161592855324074
TotalHours        : 0.00387822852777778
TotalMinutes      : 0.232693711666667
TotalSeconds      : 13.9616227
TotalMilliseconds : 13961.6227
0 голосов
/ 20 февраля 2020

Одним из простых подходов для вашего сценария будет использование Select-Object для создания пакетов файлов и переменной счетчика $i для создания имен папок, соответствующих номеру пакета.

$i = 1
while (($files = Get-ChildItem *.jpg, *.jpeg).Count -gt 0) 
{
    $folderPath = ".\Folder $i"
    New-Item -Type Directory $folderPath
    $files | Select-Object -First 5000 | Move-Item -Destination $folderPath
    $i += 1
}

См. вопрос , который @ Matthew опубликовал в комментариях о нескольких альтернативных способах решения этого типа проблемы.

Примечание: я предполагаю, что у вас еще нет подпапок с именем «Папка 1», «Папка 2» и т. д ...

...