Categorías
Powershell

Mover ficheros de un directorio a otro siguiendo un determinado filtro

Supongamos que tenemos unos ficheros en unos directorios equivocados. Por ejemplo tenemos unas facturas guardadas por años. Para ello hemos creado una carpeta por cada año, 2020,2021,etc y dentro de cada carpeta, hemos creado a su vez otra carpeta con el numero de nuestro cliente, por ejemplo el 27. Finalmente, en esta carpeta hemos metido la factura F.20.1234.pdf, pero nos hemos dado cuenta que no está en la carpeta correcta, puesto que pertenece al año 2020 (F.20.1234.pdf) y no al 2021 donde hemos dejado el documento.

En la imagen inferior vemos como quedaría.

Evidentemente si solo fuera un fichero no sería un problema pero si fueran decenas, cientos o incluso miles, sería una tarea laboriosa ir uno a uno pasando de una carpeta a otra. Para más inri, en la carpeta 2020 no hemos ni creado la carpeta del cliente, con lo que aún sería más laborioso.

Para evitar todo este trabajo os dejo un script de powershell que hara el trabajo por vosotros. En el simplemente teneis que el valor de las variables $oldyear,$newyear,$basedir y $nameToFind para que se ajuste a vuestro caso.

En mi caso oldeyear representa la carpeta 2020, newyear la 2021 (pero en el vuestro podría ser una zona, país, o cualquier otra cosa), en basedir deberías de cambiar c:\tmp\ejemplo a vuestra ruta donde tuvieses los ficheros a cambiar. Para terminar en NameToFind poneis la cadena de texto común a todos los ficheros que quereis seleccionar, en mi caso las facturas que empiezan por F.20.

Más abajo podeis ver el script que os moverá todos los ficheros que estén en subcarpetas a partir de la carpeta $newyear->2021 y moverá los ficheros a $oldyear->2020, esto lo hara buscando en las subcarpetas y además estas subcarpetas las creará en la carpeta $oldyear si no existen.

$oldyear="2020"
$newyear="2021"
$baseDir = "c:\tmp\ejemplo\$newyear\"
#Filtraremos por ficheros que empiecen por
$NameToFind = "F.20."
#buscamos en la carpeta del 2021 los ficheros que cumplan el criterio, aunque esten en subdirectorios!!!
$filesMatching = Get-ChildItem $BaseDir -Recurse | Where-Object { $_.PSIsContainer -eq $false -and $_.Name.Contains($NameToFind) } 

$dirUnSorted=@()
foreach($file in $filesMatching){
    #Write-Host $file.Directory.Name
    $dirUnSorted+=$file.Directory.Name
}
#now we make unique the parent's directories
$dirSorted= $dirUnSorted | Sort-Object | Get-Unique




$(foreach($dir in $dirSorted){

   #si no existe el directorio lo creamos
   If(!(test-path "c:\tmp\ejemplo\$oldyear\$dir\"))
   {
      New-Item -ItemType Directory -Force -Path "c:\tmp\ejemplo\$oldyear\$dir\"
   }
   #movemos los elementos que cumplan en criterio
   move-item -Path "c:\tmp\ejemplo\$newyear\$dir\F.20.*.pdf" -Destination "c:\tmp\ejemplo\$oldyear\$dir\"  -PassThru
}) 

y el resultado final es este, donde podeis ver que se ha creado la carpeta 27 y en ella se ha movido el fichero F.20.1234.pdf.

En la salida del powershell podeis ver como el fichero se ha movido de una carpeta a otra.

Este script os puede ayudar a mover ficheros de una carpeta a otra siguiendo vuestro criterio sin tener que hacerlo manualemnte. Dejad vuestros comentarios.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *