Mover archivos a la ubicación apropiada en función de su extensión
-
28-10-2019 - |
Pregunta
Tengo un script de limpieza que mueve archivos en función de su extensión a ubicaciones preestablecidas apropiadas.
Por ejemplo, un archivo con la extensión .xls se moverá a la carpeta ~ xls, .sql a ~ sql y así sucesivamente. Aquí está el mi guión.
$dirtyfolder = "\\server\c$\Documents and Settings\user\Desktop\"
$org = "\\BACKUPS\users\"
dir $dirtyfolder -fil *.doc | mv -dest "$($org)ORG\doc"
dir $dirtyfolder -fil *.txt | mv -dest "$($org)ORG\txt"
dir $dirtyfolder -fil *.sql | mv -dest "$($org)ORG\sql"
dir $dirtyfolder -fil *.log | mv -dest "$($org)ORG\log"
dir $dirtyfolder -fil *.zip | mv -dest "$($org)ORG\zip"
dir $dirtyfolder -fil *.7z | mv -dest "$($org)ORG\zip"
dir $dirtyfolder -fil *.png | mv -dest "$($org)ORG\img"
dir $dirtyfolder -fil *.jpg | mv -dest "$($org)ORG\img"
dir $dirtyfolder -fil *.mp3 | mv -dest "$($org)ORG\mp3"
Soy plenamente consciente de que esto de una manera inelegada para lograr mi objetivo. Así que me gustaría saber cómo puedo modificar el script para que pueda
- Reutilizar el código repetitivo
- Si la carpeta de destino no existe, debe crearse.
- Grupo extensiones similares, como PNG y JPG
Solución
Probado. Una solución (no recursiva) que no administra la agrupación:
ls $dirtyfolder/* | ? {!$_.PSIsContainer} | %{ $dest = "$($org)ORG\$($_.extension)" if (! (Test-Path -path $dest ) ) { new-item $dest -type directory } mv -path $_.fullname -destination $dest }
Solución con agrupación:
ls $dirtyfolder/* | ? {!$_.PSIsContainer} | %{ $dest = "$($org)ORG\$(get-destbytype $_.extension)" if (! (Test-Path -path $dest ) ) { new-item $dest -type directory } mv -path $_.fullname -destination $dest }
dónde get-destbytype
es la siguiente función:
function get-destbytype($ext) { Switch ($ext) { {$ext -match '(jpg|png|gif)'} { "images" } {$ext -match '(sql|ps1)'} { "scripts" } default {"$ext" } } }
Otros consejos
Esta es mi prueba de trabajo
$source = "e:\source"
$dest = "e:\dest"
$file = gci $source | ? {-not $_.psiscontainer}
$file | group -property extension |
% {if(!(test-path(join-path $dest -child $_.name.replace('.','')))) { new-item -type directory $(join-path $dest -child $_.name.replace('.','')).toupper() }}
$file | % { move-item $_.fullname -destination $(join-path $dest -child $_.extension.replace(".",""))}
El script encontrará todas las extensiones diferentes dentro de la carpeta fuente. Para cada extensión, si la carpeta aún no existe dentro del destino, se creará. La última fila recorrerá cada archivo desde la fuente y lo moverá al destino de la subcarpeta derecho.
Si desea colocar imágenes con diferentes extensiones dentro de la misma carpeta, debe hacer una verificación adicional, utilizando una instrucción IF o A Switch.