Canvi nom fitxers amb PowerShell

14 Setembre 2013
Josep Ma Solanes 0

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.

PowerShell1

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!

PowerShell7

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ó.

PowerShell6

Per llistar els fitxers del directori, s’utilitza la instrucció Get-ChildItem. Escriure en aquesta consola:

get-childitem

PowerShell5

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).

PowerShell4

 

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

PowerShell3

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ó.

PowerShell2

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:

 

Deixar un comentari

Recorda que no es contestaran preguntes personals, només d´interés comú que ens enriqueixin a tots.
La teva adreça de correu electrònic no serà publicada. Els camps obligatoris estan indicats.

Aquest lloc utilitza Akismet per reduir el correu brossa. Aprendre com la informació del vostre comentari és processada