Como classificar arquivos em pastas, de acordo com nomes de arquivos - Windows CMD

5

Como classifico arquivos em pastas, de acordo com nomes de arquivos, usando comandos CMD / PowerShell?

Digamos que eu tenha uma pasta contendo uma grande quantidade de arquivos (mais de 20.000 arquivos), em que todos os arquivos tenham a mesma convenção de nomenclatura, por exemplo: (observe o padrão)

t_1001_1801.png
t_1001_1802.png
t_1001_1803.png
...
t_1001_2112.png (last file starts with 't_1001_')
t_1002_1801.png
t_1002_1802.png
t_1002_1803.png
....
t_1002_2112.png
t_1003_1801.png
t_1003_1802.png
t_1003_1803.png
...
t_1214_2112.png (last file in folder)

Eu executo este comando CMD para criar uma lista de pastas:
for /l %i in (1001,1,1214) do md x%i
que cria uma lista de pastas, por exemplo:

x1001
x1002
x1003
...
x1214

Agora, gostaria de classificar (mover) os arquivos nas pastas de acordo com o nome do arquivo, por exemplo:

- move the files t_1001_1801.png to t_1001_2112.png to the folder x1001.
- move the files t_1002_1801.png to t_1002_2112.png to the folder x1002.
...

Posso usar comandos do shell para essa finalidade?

    
por Gil Epshtain 03.06.2018 / 12:11

3 respostas

7

Você simplesmente precisa dividir o FileName, obter o número (como 1001), comparar o número com as pastas, obter a pasta correta e mover os arquivos para lá:

# Folder where Files and Folders are located
$TopFolder = "C:\Install"

# Getting Folders and Files
$Folders = gci $TopFolder -OutVariable Files | ? { $_.PSisContainer }

# Loop over all Files with *.png extension
$Files | ? { $_.Extension -eq '.png' } | % {

    # Split FileName to get the number (like 1001)
    $num = ($_.Name -split "_")[1]

    # Get FolderName by reading out foldername (without 'x') and compare it to number
    $MoveTo = $Folders | ? { $_.Name.substring(1,($_.Name.length -1)) -eq $num }

    # If a folder was found, move file there. else print error
    if ($MoveTo)
    {
        Move-Item $_.FullName $MoveTo -Force
        Write-Host "Copied File $($_.Name) to $MoveTo"
    }
    else 
    { 
        Write-Host "Did not find folder x$($num) in $TopFolder" 
    }
}
    
por 03.06.2018 / 12:40
5

O seguinte lote

  • Alterações na pasta para começar em
  • itera com um comando for por todo o arquivo * .png
  • usa um a / f para dividir o nome nos sublinhados em tokens e usa o segundo terceiro para
  • verifique se existe uma subpasta x com o número, se não for criada
  • finalmente move o arquivo para a subpasta.
:: Q:\Test18\SU_1328200.cmd
@Echo off 
PushD "C:\Users\UserName\Pictures\"

For %%A in (t_*_*_*.png) do For /F "tokens=3delims=_" %%B in ("%%A") Do (
  If Not exist "x%%B" MD "x%%B"
  Move "%%A" "x%%B"
)
PopD

Árvore de exemplo / F após executar o lote
(desatualizado do primeiro requisito com o segundo token)

> tree /F
├───x1001
│       t_1001_1801.png
│       t_1001_1802.png
│       t_1001_1803.png
│       t_1001_2112.png
│
├───x1002
│       t_1002_1801.png
│       t_1002_1802.png
│       t_1002_1803.png
│       t_1002_2112.png
│
├───x1003
│       t_1003_1801.png
│       t_1003_1802.png
│       t_1003_1803.png
│
└───x1214
        t_1214_2112.png

Um script do PowerShell:

## Q:\Test18\SU_1328200.ps1
PushD  "C:\Users\UserName\Pictures\"
Get-ChildItem t_*_*_*.png |
  Where BaseName -match 't_\d{2}_(\d{4})_\d{4}'|
    Group {'x'+$Matches[1]}|
      ForEach{MD $_.Name;$_.Group|Move -Dest $_.Name}
    
por 03.06.2018 / 13:22
0

Credito a @Neil, por sua resposta (nos comentários), eu só quero postar isso como uma resposta para os outros.

for /l %i in (1001,1,1024) do md x%i&move t_%i_* x%i

Explicação:
- Loop em% i de 1001 a 1024 (1 é a etapa de iteração)
- Para cada iteração:
1. crie um diretório chamado x% i (x1001, x1002, ...).
2. mova o arquivo que corresponde à expressão regular t_% i_ * (t_1001_1801) para o diretório x% i (que acabou de ser criado).

    
por 04.06.2018 / 11:26