¿Puedo mover por lotes muchos archivos en muchos subdirectorios/carpetas separados a uno solo principal en Windows?

¿Puedo mover por lotes muchos archivos en muchos subdirectorios/carpetas separados a uno solo principal en Windows?

Tengo un montón de archivos en ubicaciones como esta:

C:/Users/(Username)/Desktop/(Parent-Collection name)/(filename1)/(filename1).ext

.../(filename2)/(filename2).ext

.../(filename3)/(filename3).ext

Estoy intentando mover los .extarchivos por lotes a la carpeta principal, por lo que es:

C:/Users/(Username)/Desktop/(Parent-Collection name)/(filename1).ext

Básicamente, elimina la necesidad de la subcarpeta, de forma muy parecida a sacar los divisores de una carpeta escolar.

Respuesta1

Quizás tengas que hacer esto concygwin, que recomendaría a cualquiera que esté (¿todavía??) ejecutando el software espía M$ Windoze.

Algo como esto debería funcionar. Ejecútelo en el directorio C:/Users/(Username)/Desktop/(Parent-Collection name)/(que en cygwin se denominaría /cygdrive/c/Users/(Username)/Desktop/(Parent-Collection name)/):

for i in `find . -name "*" -type f`; 
    do mv $i `echo $i | sed 's/.*\/\([^/]*\)/\1/'`; 
done

Eso moverá todos los archivos en todos los directorios siguientes (Parent-Collection name)a (Parent-Collection name). Específicamente, este es un dobucle con el índice irecorriendo cada archivo desde el directorio actual hacia abajo. Eso es lo que findenumera el comando. Puedes buscar la sintaxis ejecutando man find. Luego lo que ejecutas es mover ( mv) ese archivo ( $i) a la nueva ubicación. Esa nueva ubicación se especifica mediante el nombre de archivo original ( echo $i) ejecutado a través del editor de secuencias ( sed, con el que puede buscar man sed), que está configurado para eliminar la ruta, dejando el nombre de archivo base.

Sugiero probarlo (crear un directorio con un par de subdirectorios que contengan algunos archivos de texto vacíos o algo así) y asegurarse de tener una copia de seguridad.

Es posible que desees eliminar todos los directorios (ahora vacíos) debajo de tu directorio actual:

for i in `find . -name "*" -type d`; 
    do rmdir $i; 
done

La única diferencia aquí es que le indica findque busque directorios ( -type d) en lugar de archivos ( -type f) y luego elimine esos directorios ( rmdir, lo que solo funciona en directorios vacíos).

¿No es genial Linux? Cygwin te brinda algo del poder de Linux y podría ser un primer paso para que te sientas lo suficientemente cómodo con él como para que algún día incluso encuentres la capacidad de pasarte a algo como Ubuntu. :)

Respuesta2

Esto se puede hacer con Powershell, aunque no sabemos qué versión de Windows estás usando.

$sourcefolder = "C:\Users\username\Desktop\ParentCollectionName"

$allfiles = Get-ChildItem -Recurse $sourcefolder | Where-Object {$_.PSIScontainer -eq $false}
ForEach ($file in $allfiles)
    {
        $destinationfolder = Split-Path -Parent $file.Directory.FullName
        Move-Item $file.FullName $destinationfolder
    }

Todos los archivos en los subdirectorios de $sourcefolderse moverán a la ParrentCollectionNamecarpeta. Luego puede eliminar las subcarpetas vacías.

Fuente

información relacionada