Пакетное копирование файлов в новые каталоги, которые соответствуют имени файла - PullRequest
0 голосов
/ 08 февраля 2012

У меня 250 000 файлов в одном каталоге.
Все файлы имеют формат

1a.jpg  
1b.jpg  
1c.jpg  

... и увеличиваются до 1f.jpg, тогда число увеличивается на единицу

2a.jpg  
2a.jpg  
2c.jpg  

... и т. Д.

Теперь я хочу скопировать все файлы, которые начинаются с 1, в новый каталог с именем 1,
все файлы, которые начинаются с 2, в каталог 2и т. д.

Кто-нибудь может помочь с этим?

Ответы [ 4 ]

3 голосов
/ 08 февраля 2012

Если у вас есть 250 000 файлов в одном имени каталога n [af] .jpg, я бы ожидал, что n идет от 1 до 41 667, и вы хотите иметь 41 667 каталогов, каждый из которых имеет 6 файлов JPG. Если это так, вот мое решение, немного более сложное:

  • Сначала он удаляет букву (a-f) и расширение .jpg из полное имя элемента, чтобы получить папку назначения.
  • Затем он проверяет, существует ли папка назначения, если это не так создано.
  • Наконец, элемент копируется в папку назначения.

    Get-ChildItem *.jpg | ForEach-Object {
     $destination = $_.FullName -replace '[a-f]\.jpg'
     if (-not (Test-Path -Path $destination -PathType Container)) {
      $null = New-Item -Path $destination -ItemType directory
     }
     Copy-Item -Path $_.FullName -Destination $destination
    }
    
3 голосов
/ 08 февраля 2012

Сгруппируйте все файлы по первому символу, а затем скопируйте каждую группу в папку назначения:

Get-ChildItem -Filter *.jpg | Group-Object {$_.Name[0]} | Foreach-Object { $_.Group | Copy-Item -Destination "C:\test\$($_.Name)" }

РЕДАКТИРОВАТЬ: это должно выполняться быстрее:

Get-ChildItem *.jpg | Copy-Item -Destination { "C:\test\$($_.Name[0])" }
1 голос
/ 08 февраля 2012

try:

 dir -filter *.jpg | % { Copy-Item -PATH $_ -DESTINATION .\$($_.BaseName.ToCharArray()[0]) }

Таким образом, папки назначения ДОЛЖНЫ существовать!

0 голосов
/ 09 февраля 2012

Вы можете попробовать этот «старомодный» пакетный файл .BAT, если хотите:

@echo off
setlocal EnableDelayedExpansion
for %%f in (*.jpg) do (
   set dir=%%~Nf
   set dir=!dir:~0,-1!
   if not exist !dir! md !dir!
   copy %%f !dir!   
)

Скопируйте этот пакетный файл в каталог, где находятся файлы, и выполните его. Это создаст новые каталоги на том же уровне, но вы можете легко изменить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...