Cambie el nombre de los archivos por lotes y muévalos a subcarpetas (que deben crearse)

Cambie el nombre de los archivos por lotes y muévalos a subcarpetas (que deben crearse)

Tengo una carpeta llena de archivos con el formato "10389-2001.pdf", así que primero un número de cinco dígitos, un guión y luego un número de cuatro dígitos. Quiero cambiar el nombre de todos para que el archivo en sí solo se llame "2001.pdf", pero se mueva a una nueva subcarpeta "10389". Dado que esta subcarpeta aún no existe, será necesario crearla.

Estoy abierto a sugerencias sobre cómo hacer esto en la línea de comandos de Windows, Powershell o Cygwin.

Respuesta1

Un script de PowerShell:

Get-ChildItem *-*.pdf|Foreach-object {
    $Dir, $File = $_.Name.Split('-')[0,1]
    if (!(Test-Path $Dir)){MD $Dir}
    $_| Move -Destination ("$Dir\$File") 
}

El lote:

@echo off
for /F "Tokens=1* delims=-" %%A in ('Dir /B "*-*.pdf"') do (
    If not exist ".\%%A" MD ".\%%A"
    Move "%%A-%%B" "%%A\%%B"
)

Árbol antes:

> tree /f .
Z:\
    10389-2001.pdf
    10815-2017.pdf

Árbol después:

> tree /f .
Z:\
├───10389
│       2001.pdf
└───10815
        2017.pdf

Respuesta2

Fácil con EBV. Copie el código a un archivo con extensión '.vbs'

on Error Resume Next   
sFolder = "D:\test\"
dFolder = "D:\test1\"
Set oFSO = CreateObject("Scripting.FileSystemObject")

For Each oFile In oFSO.GetFolder(sFolder).Files
    NameParts = split(oFile.Name,"-")
    Set f = oFSO.CreateFolder(dFolder & NameParts(0))
    set fi = oFSO.GetFile(oFile)
    fi.Copy dFolder & NameParts(0) & "\" & NameParts(1)
Next

ajustar la carpeta de origen y destino. No olvides "\" al final. La carpeta de destino debe existir. Codificado rápido y sucio. Solo ?????-????? archivos en la carpeta fuente.

información relacionada