Procesar varios archivos por línea de comandos en Windows.-

Para aplicar un cierto acción a varios archivos desde la línea de comandos de Windows existe la instrucción forfiles.

En Windows 7, la invocación tiene los siguientes parámetros (todos son opcionales):

/P : ruta sobre la cual buscar los archivos
Si no se especifica, se considera el directorio actual
/S: se procesan los subdirectorios del path recursivamente
/M : patrón de los archivos a considerar, pudiendo indicar nombre y extensión. Por ej: *.log
Si no se especifica, se considera *
/D { [+] | – }{ dd/mm/aaaa | N }: selecciona archivos a partir de la fecha de última modificación de cada uno.
Si no se especifica el signo -, se considera por defecto +
-dd/mm/aaaa: fecha de última modificación anterior o igual a dd/mm/aaaa
+dd/mm/aaaa: fecha de última modificación posterior o igual a dd/mm/aaaa
-N: fecha de última modificación anterior o igual a la fecha actual menos N días
+N: fecha de última modificación posterior o igual a la fecha actual más N días
/C “”: indica la acción a ejecutar sobre cada uno de los archivos que hayan sido seleccionados
Si no se especifica, se considera “cmd /c echo @file”
Si se desea utilizar un comando de CMD, deben estar precedidos por “cmd /c”
Variables disponibles en
@file: nombre del archivo
@fname: nombre de archivo sin extensión
@ext: extensión del archivo
@path: ruta de acceso completa al archivo
@relpath: ruta de acceso relativa del archivo
@isdir: “TRUE” si es un directorio y “FALSE” si es un archivo
@fsize: tamaño del archivo en bytes
@fdate: última fecha de modificación del archivo
@ftime: última hora de modificación del archivo

Ejemplos:

forfiles /P C:\logs /D -20 /C «cmd /c del @path»

Borra los archivos del directorio logs de más 20 días desde su última fecha de modificación

forfiles /C «cmd /c if @isdir==TRUE echo @file»

Imprime por pantalla los directorios que se encuentren en la ruta actual

forfiles /P C:\Documents\ /S /M *.xlsx /C «cmd /c echo @fname – @fdate»

Muestra el nombre y fecha de última modificación de cada uno de los archivos de Excel dentro del directorio de documentos (y subdirectorios)

Publicado en BATCH - DOS | Deja un comentario

BATCH – Script para obtener la fecha y hora en WINDOWS.-

Publicado en BATCH - DOS | 1 comentario

BASH – Script ejemplo de uso bucle UNTIL.-

Publicado en Unix - Linux | Deja un comentario

BASH – Blucle infinito con WHILE y quiebre (salida) con instrucción BREAK.-

Publicado en Unix - Linux | Deja un comentario

BASH – Archivo de bloqueo.-

Evitar problemas de concurrencia

Si dos copias del script son iniciadas al mismo tiempo, es posible (aunque difícil, estas operaciones duran pocos milisegundos) que las dos copias lleguen al mismo tiempo al código que comprueba que el archivo $LOCK_FILE exista. Si esto sucede, ambas copias del script pueden determinar que el archivo no existe, y continuar su ejecución.

Esta clase de problemas en donde dos programas compiten por un recurso, sin que podamos determinar cuál de ellos lo obtiene, se conocen como race conditions («condiciones de carrera»). En muchos casos, cuando es posible, los evitamos usando operaciones atómicas [3].

Para este problema en particular, veremos dos variantes.

1.mkdir

Con mkdir tenemos una solución al problema, siempre que estemos dispuestos a usar un directorio y no un archivo como $LOCK_FILE. La orden

tiene dos resultados posibles: si el directorio no existe, será creado, y mkdir saldrá con un código de éxito. Si el directorio existe, mkdir fallará y no habrá cambios en el sistema.

2.noclobber

BASH tiene una opción llamada noclobber, que hace que si intentamos redirigir salida (vía >) a un archivo que ya existe, la redirección falle. Basta entonces con escribir algo como:

Para desactivar noclobber (como hacemos con las opciones de bash que modifican su comportamiento y usamos para una parte específica de nuestro script), debemos añadir una línea conteniendo set +C. Otra opción es utilizar una subshell, de tal manera que la shell que corre nuestro script no se vea afectada por el cambio, y por tanto no sea necesario desactivar nada:

Con estas mejoras, así es como nuestro script se ve ahora:

Publicado en Unix - Linux | Deja un comentario