Canvi nom fitxers amb PowerShell

Antecedents
Disposo d’un arxiu de material de referència en una llibreta de l’aplicació Microsoft OneNote. Aquesta aplicació, organitza les llibretes en carpetes i subcarpetes (són les múltiples seccions) en el sistema de fitxers, on cadascuna d’elles conté un arxiu per cada secció. El meu arxiu té una mida i organització considerable (uns 357 fitxers que ocupen unes 3 GB). Per motius que no venen al cas, tinc la necessitat de recuperar la còpia de seguretat d’aquest arxiu, però resulta que aquesta còpia, en el nom de l’arxiu (i per tant de la secció), hi té afegit “.one (data de copia)”. per exemple, un arxiu pot ser:
Notes de reunions.one (01-09-2013).one
Objectiu
Eliminar del nom de tots els arxiu la part “.one (data de copia)”. Seguint l’exemple, deixar l’arxiu com a:
Notes de reunions.one
Opcions
1. Obrir cada carpeta, localitzar el primer arxiu, seleccionar canviar nom i acceptar. Repetir la operació fins a finalitzar. Buff!!! Quina feinada.
2. Localitzar per internet una aplicació gratuïta que ho faci. Sincerament, no té ganes de perdre el temps buscant una aplicació que faci no sé què, instal·lar-la, provar-la, desinstal·lar-la, etc…
3. Automatitzar la tasca mitjançant la PowerShell del propi sistema operatiu. No ha de fer por que no mossega.
Per saltar tota la teoria i anar al gra, anar directament al final de l’entrada.
Operativa PowerShell
El primer que s’ha de fer és localitzar la consola de PowerShell a l’equip:
- Microsoft Windows Vista i 7, està una mica amagada. S’ha d’anar al menú INICIO > Accesorios > Windows PowerShell.
- Microsoft Windows 8, des de l’entorn ModernUI (el de mosaics), escriure Power o bé buscar-la a la carpeta d’Eines Administratives del Panell de Control.
Potser sobta trobar 4 icones amb el mateix nom. Corresponen a les versions d’entorn de consola (Windows PowerShell) o amb assistent (Windows PowerShell ISE) i si és en 32 (x86) o 64 bits (no indica res). Seleccionar una de les opcions de consola (sense ISE, ja sigui 32 o 64 bits). Es mostra una finestra del tipus MS-DOS d’abans, és la consola i no se li ha de tenir por!
S’escriuen unes senzilles instruccions:
Situar-se a la carpeta arrel on hi ha les dades. S’utilitza la instrucció CD. Recordar:
- c: ==> nom unitat de disc seguit de : <== Canvia de disc, el disc dur, la unitat USB, el CD-Rom, etc…
- cd \ ==> cd (espai) \ <== va a l’arrel de la unitat de disc.
- cd nomcarpeta, entra dins una carpeta. Si el nom de la carpeta conté espais, aquest s’ha de posar entre cometes dobles.
En l’exemple, la carpeta arrel es troba a la unitat C: dins la carpeta “canvi de noms”, les instruccions a utilitzar:
c: cd \ cd "canvi de noms"
La primera instrucció ens la podríem estalviar ja què ja som a la unitat de disc on hi ha la carpeta, l’he posada per millor interpretació.
Per llistar els fitxers del directori, s’utilitza la instrucció Get-ChildItem. Escriure en aquesta consola:
get-childitem
Simplement mostra el llistat de carpetes i arxius que conté la carpeta on estem. Però vull veure tots els arxius de dins les carpetes! Afegir el paràmetre -recurse.
get-childitem -recurse
Ara surten un munt de coses que omplen la pantalla i més. Acotem el llistat, PowerShell permet encadenar altres instruccions amb el símbol | (es fa amb Alt Gr i sense deixar pressionar la tecla 1; en el teclat espanyol).
Per veure el llistat de fitxers en una columna on apareix només el nom (Name), s’utilitza la instrucció ft, equival a Format-Table, seguida del nom dels camps, separats per una coma, que es volen veure. Per exemple, llistar les carpetes que pengen de l’arrel per data de modificació i nom, la instrucció és:
get-childitem | ft LastWriteTime,Name
Per veure una columna amb el nom de totes les carpetes i arxius que pengen de la carpeta arrel:
get-childitem -recurse |ft name
Al llistat apareixen el nom de les carpetes i només vull el nom dels arxius de OneNote (tenen extensió .one). Toca filtrar aquesta llista, afegint el paràmetre -filter i a continuació el text a cercar utilitzant el símbol de comodí *. Veure tots els arxius amb extensió .one (o .jpg, .docx, etc…)
get-childitem -recurse -filter "*.one" | ft name
Veure tots els arxius que dins el seu nom contingui un espai seguit d’un parèntesi (s’ha de col·locar el símbol comodí a l’inici i final del text a cercar.
get-childitem -recurse -filter "* (*" | ft name
Ja tinc tots els arxius que els vull canviar el nom, en aquest cas, eliminar el .one seguida de la data. Ull, que l’extensió final .one s’ha de mantenir sinó l’aplicació no sabrà que fer amb l’arxiu.
Per canviar el nom d’un element, s’utilitza la instrucció rename-item el nom de l’arxiu original seguit del paràmetre -NewName amb el nom de l’arxiu nou.
rename-item "c:\arxiu original.one" -NewName "arxiu nou.one"
Però, la gràcia és encadenar les instruccions. És a dir, per cada arxiu llistat en la instrucció Get-ChildItem, agafa només el nom ($_.name), busca et text (-replace) “.one (el 01-08-2013).one” i es substitueix per “.one”, d’aquesta manera es manté el nom de l’extensió.
get-childitem -recurse -filter "* (el 01-08-2013)*" | rename-item -NewName {$_.Name -replace ".one \(el 01-08-2013\).one",".one"} -WhatIf
Analitzant la instrucció. Primer es cerquen els arxius (get-childitem -recurse) que en el seu nom contenen el text (-filter) ” (el 01-08-2013)”, per tant s’introdueix amb els comodins a inici i final (*).
S’encadena el resultat amb la instrucció per canviar el nom (rename-item) a la qual ja no fa falta indicar el nom original perquè l’agafa del llistat de la primera instrucció. Però si el nou nom (-NewName) que s’obté del nom que proporciona la primera instrucció ($_.Name) a la que s’ha de canviar la part del text (-replace) “.one (el 01-08-2013).one” per “.one”. En aquest punt, fixar-se que a la instrucció, abans del parèntesi hi va el símbol \. No és una equivocació, sinó que el parèntesi es considera un símbol especial i dins d’una instrucció actua com a tal. Si el que es pretén, com en aquest cas, és trobar en el text el parèntesi, s’ha d’afegir el símbol \ al seu davant. També veure que aquests paràmetres van dins unes corxeres { } indicant que no és un simple paràmetre sinó que es fan vàries operacions (canviar un text per un altres) per obtenir un resultat.
Al final acaba amb la instrucció -Whatif. Aquest paràmetre s’utilitza per veure quin resultat produeix la línia de comandes, però SENSE executar-les, és a dir, es veuria quins fitxers canvia i amb quin nom, però realment no es fa cap modificació.
Si el resultat és l’esperat, ja es poden realitzar les modificacions, eliminat el paràmetre -WhatIf.
get-childitem -recurse -filter "* (el 01-08-2013)*" | rename-item -NewName {$_.Name -replace ".one \(el 01-08-2013\).one",".one"}
Caldrà modificar el filtre i el text a canviar per afinar, però ja no són 357 arxius, sinó una línia!
Similar Posts by The Author:
- Microsoft SQL Server con SMB3
- Microsoft SQL Server amb SMB3
- Containers en Linux
- Containers amb Linux
- Migrar el servidor de archivos a Windows Server 2019
- Migrar el servidor de fitxers a Windows Server 2019
- Puerta enlace a Azure en el Windows Admin Center
- Porta enllaç a Azure en el Windows Admin Center
- Hola mundo! WordPress 5 y Gutenberg
- Hola món! WordPress 5 i Gutenberg