2 votos

Mueve archivos a una carpeta nombrada por parte de su nombre de archivo

Tengo archivos desde una GoPro Fusión de la cámara que representan imágenes y películas. Los nombres de los archivos aspecto

GP (para "GoPro")
(dos más cartas de no importancia particular)
(una serie de dígitos; tal vez cuatro o seis dígitos)
.  (un período)
(una extensión)

Algunas de las extensiones más comunes, como JPG, MP4y WAV; otros son poco comunes. Algunos ejemplos de nombres de archivo son GPFR0000.jpg, GPBK0000.jpg, GPFR0000.gpr, GPFR1153.MP4, GPFR1153.THM y GPBK142857.WAV. Pero las extensiones no son relevantes para esta pregunta.

Para cada imagen y la película hay un conjunto de archivos cuyos nombres tienen la misma serie de dígitos justo antes de la extensión. Así, por ejemplo, GPFR1153.LRV y GPBK1153.MP4 pertenecen al mismo conjunto.

Quiero que todos los archivos de cada conjunto se agrupan en un directorio cuyo nombre es GP , seguido por la serie de dígitos. Por ejemplo, si tengo

GPFR0000.jpg
GPBK0000.jpg
GPFR0000.gpr
GPFR0000.gpr
GPFR1153.LRV
GPFR1153.MP4
GPFR1153.THM
GPBK1153.WAV
GPBK1153.MP4
GPQZ142857.FOO

todos en un mismo directorio, el resultado debe ser

GP0000\GPFR0000.jpg
GP0000\...
GP1153\GPFR1153.LRV
GP1153\GPFR1153.MP4
GP1153\...
GP142857\GPQZ142857.FOO

Sería posible con una secuencia de comandos (Windows 10)? He encontrado este (PowerShell) secuencia de comandos por mousioen De forma recursiva mueve miles de archivos en subcarpetas de windows, pero ella se aborda un problema un poco diferente, y me gustaría ayudar a adaptarlo a mis necesidades (Yo soy un artista, no un programador).

# if run from "P:\Gopro\2018", we can get the image list
$images = dir *.jpg

# process images one by one
foreach ($image in $images)
{
    # suppose $image now holds the file object for "c:\images\GPBK1153.*"

    # get its file name without the extension, keeping just "GPBK1153"
    $filenamewithoutextension = $image.basename

    # group by 1 from the end, resulting in "1153"
    $destinationfolderpath = 
        $filenamewithoutextension -replace '(....)$','\$1'

    # silently make the directory structure for "1153 GPBK1153"
    md $destinationfolderpath >$null

    # move the image from "c:\images\1234567890.jpg" to the new folder "c:\images\1\234\567\890\"
    move-item $image -Destination $destinationfolderpath

    # the image is now available at "P:\Gopro\2018\1153\GPBK1153.*"
}

0voto

Scott Puntos 10303

En función de mi comprensión (posiblemente defectuosa) de lo que desea, puede hacerlo con el siguiente script de PowerShell. Tenga en cuenta que esto se deriva de un trabajo realizado por mousio , publicado en Mover de forma recursiva miles de archivos a ventanas de subcarpetas .

 # If run from "P:\Gopro\2018", we can get the file list.
$images = dir GP*

# Process files one by one.
foreach ($image in $images)
{
    # Suppose $image now holds the file object for "P:\Gopro\2018\GPBK1153.FOO"

    # Get its file name without the extension, keeping just "GPBK1153".
    $filenamewithoutextension = $image.basename

    # Grab the first two characters (which we expect to be "GP"),
    # skip the next two characters (which we expect to be letters; e.g., "BK"),
    # then grab all the characters after that (which we expect to be digits; e.g., "1153")
    # and put them together, resulting in "GP1153".
    $destinationfolderpath = 
        $filenamewithoutextension -replace '(..)..(.*)','$1$2'

    # Silently make the directory structure for "GP1153".
    md $destinationfolderpath > $null 2>&1

    # Move the file from "P:\Gopro\2018\GPBK1153.FOO" to the new folder "P:\Gopro\2018\GP1153"
    move-item $image -Destination $destinationfolderpath

    # The file is now available at "P:\Gopro\2018\GP1153\GPBK1153.FOO".
}
 

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: