domingo, abril 22, 2007

Renombrar archivos con rename (Linux)

Muchas veces cuando estamos desarrollando nuevos sitios, es común tener que renombrar muchos archivos, generalmente fotos.

Para usar las fotos de un producto de manera sencilla, ponemos la clave del producto como el nombre de este y la extensión jpg pero cuando además de la foto también tenemos el thumbnail usamos la clave con el sufijo _th

Si en un folder tengo cientos de archivos gráficos que serán thumbnails pero que aún no llevan el sufijo, tendré que renombrarlos a todos, con rename es muy fácil.

La sintaxis de rename:
rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]


La parte que quizás más asuste es la del perlexpr. A estas alturas las expresiones regulares con Perl deberían de ser cosa de todos los días, pero aún existen administradores que no se llevan bien con ellas.

-v es para ver los resultados
-n es para ver los resultados sin que haga cambios
-f es para forzar la sobreescritura de los archivos resultantes

Para esta necesidad yo tengo la siguiente lista de archivos:
AA02.jpg
AJ11.jpg
AJ14.jpg
BO12.jpg
...

y los quiero renombrar a:
AA02_th.jpg
AJ11_th.jpg
AJ14_th.jpg
BO12_th.jpg
...

La expresión regular es la siguiente s/\.jpg$/_th\.jpg/ quedando el comando como sigue:
$> rename -v 's/\.jpg$/_th\.jpg/' *.jpg
AA02.jpg renamed as AA02_th.jpg
AJ11.jpg renamed as AJ11_th.jpg
AJ14.jpg renamed as AJ14_th.jpg
BO12.jpg renamed as BO12_th.jpg
...


Mas información:
How to Bulk Rename Files in Linux (Terminal or GUI)

lunes, abril 09, 2007

Alternando Colores en tablas con jstl

Es muy común mostrar tablas o listas en las aplicaciones. Para facilitar su lectura usamos diferentes colores para cada fila (row).
<c:if test="${!model.editMode}">
<table>
<c:forEach items="${model.marcas}" var="marca" varStatus="loop">
<tr style="background: ${((loop.index % 2) == 0) ? '#D9E5F2' : '#ABC6E2'}">
<td>
Español: <c:out value="${marca.entNombre.es}" />
<br>
Inglés: <c:out value="${marca.entNombre.en}" />
</td>
<td>
<c:url value="marcas.html?id=${marca.marcaId}" var="editLink" />
<a href="${editLink}">Editar</a>
</td>
</tr>
</c:forEach>
</table>
</c:if>
Es muy simple y funciona muy bien, puede haber otras adaptaciones y en lugar de poner directamente el color de la fila podemos colocar un estilo.

<c:forEach items="${model.marcas}" var="marca" varStatus="status">
<tr class="${((status.index % 2) == 0) ? 'par' : 'impar'}">


Esto gracias a los valores que nos da varStatus. En la siguiente tabla pongo todos:
  • current getCurrent()
    El item (de la colección) para el actual round de iteración
  • index getIndex()
    El índice desde cero para el actual round de iteración
  • count getCount()
    La cuenta desde uno para el actual round de iteración
  • first isFirst()
    Bandera que indica si el actual item es el primero de la ronda de iteración
  • last isLast()
    Bandera que indica si el actual item es el último de la ronda de iteración
  • begin getBegin()
    El valor de begin
  • end getEnd()
    El valor de end
  • step getStep() El valor de step