feed://
Anotaciones
Comentarios

chapuza v2.0

Problema: Estamos
dentro de un directorio en el que hay muchos subdirectorios (34). En
cada uno de ellos hay un archivo que se llama mensajeitor.txt; tiene permisos de escritura/lectura
para el propietario y de lectura para el resto (644) y esto no
debería ser así. Todos estos archivos deberían
tener permisos 666 (lectura/escritura para todo el mundo). ¿Como
lo hacemos sin tener que hacerlo manualmente? Porque ejecutar 34 chmod’s
para cambiarle los permisos a cada uno de esos archivos… como que no.

Solución: Esta
es la solución mas eficiente. Es la que uno debe pensar. Estamos
en un entorno BASH, así que ejecutemos una orden propia de este entorno capaz de hacerlo.

   for i
in `find . -name mensajeitor.txt`; do chmod 666 $i; done

Con ese simple, bucle el problema esta solucionado :)

Solución chapucera:
¿Y si escribo un pequeño algoritmo en C++ que me resuelva
el problema de una tacada? … Esto es mucho menos eficiente. Pues hay
que tener en cuenta que en BASH tenemos que teclear una simple
línea, mientras que de otro modo (con C++ por ejemplo) son
bastantes más líneas de código jeje. Además
que no es coherente hacerlo de este modo pero vamos… estaba aburrido
y quería hacerlo porque implicaba utilizar ficheros (¡y
así practicaba! ;) Este es el resultado:

/*
 * Chapuza v2.0
 *
 * lo que hace este algoritmo es lo mismo que lo que se puede hacer
 * en UNA linea utilizando "lenguaje bash" dicha linea seria:
 *      for i in `find . -name mensajeitor.txt`; do chmod 644 $i; done
 *
 */
 
#include <iostream>
#include <fstream>
 
const int kCHMOD = 100;
const int kLINEA = 50;
 
using namespace std;
 
void chapuza(int files) {
   fstream ficLogico;
   char chmod[kCHMOD]="chmod 666 ";
   char copiaChmod[kCHMOD]="chmod 666 ";
   char linea[kLINEA];
   int i;
 
   ficLogico.open("lista.txt", ios::in); // leeremos el archivo lista.txt
   if (!ficLogico)
           cout << "Error de apertura";
   else {
       /* he de usar este bucle que emula a la funcion eof()
        * si lo pongo tal y como esta en la version 1.0 de chapuza
        * el system(chmod) funciona. las concatenaciones se van realizando
        * y todo parece funcionar bien. pero al final da un error
        *
        * # ./chapuza
        * chmod: too few arguments
        * Try `chmod --help' for more information.
        */
 
       for (i=1; i<=files; i++) {
              ficLogico.getline(linea,kLINEA);
              strcat(chmod,linea); // modificamos chmod[]
              system(chmod); // esto ejecuta un chmod 666 numLinea[i]
              strcpy(chmod,copiaChmod); // dejamos chmod[] como estaba
        }
 
        ficLogico.close(); // cierre del fichero
   }
}
 
int main() {
   int numLineas;
 
   // miramos cuantos archivos 'mensajeitor.txt' hay y los contamos
   numLineas = system("find . -name mensajeitor.txt | wc -l");
   chapuza(numLineas); // este parametro es para el bucle for de arriba
}

Me costó bastante trabajo hacer que funcionara, pues era incapaz
de hacer que las dos cadenas que utilizo (chmod y linea) hicieran
correctamente todas las concatenaciones que deben hacer. Me daba
violaciones de segmento; por todas partes. Uuuff…
la verdad que fue complicado jeje. Menos mal que tenía gente que
me ayudó ;) estaba conectado al IRC, en el canal de href="http://www.gulalug.org" target="nwindow">mi LUG y un
amigo me estuvo ayudando en todo momento (hasta me dio una clase
rápida de gdb , ¡gracias chema! :D)

Fue divertido, y comprobar que funciona después de tanto
fallo… ¡mola! ;)

Hay 3 comentarios

  1. on 26 Sep 2003 at 05:58 David

    El programa en C está muy bien….pero lo que no entiendo son dos cosas:

    1) ¿de donde sale el archivo “lista.txt”? :P
    2) ¿kCHMOD no debería valer 66? (16 para el texto “chmod 666 ” + 50 que tienes en kLINEA)

    Espero no haberme equivocado xD, de todas formas me gustan los dos sistemas.

    salu2

  2. on 26 Sep 2003 at 05:59 ebarbeito

    Hola David :) El archivo lista.txt lo saco haciendo un:

    find . -name mensajeitor.txt > lista.txt

    Es decir, volcando todos los recultados obtenidos de buscar ese archivo (mensajeitor.txt) al archivo lista.txt. No comenté esto en el post porque supongo que se me olvidó, lo siento. Luego pensé que si alguien leyese el post y el código con un poco de tranquilidad y luego me preguntara, ya respondería y aclararía jeje. Aunque no se me tendría que haber pasado y tuve que haber explicado qué contenía lista.txt, es verdad :)

    # cat lista.txt
    ./mensabruje/mensajeitor.txt
    ./mensabufon/mensajeitor.txt
    ./mensabuitrako/mensajeitor.txt
    ./mensacandy/mensajeitor.txt
    ./mensachili/mensajeitor.txt
    ./mensacongo/mensajeitor.txt
    ./mensacupra/mensajeitor.txt
    [ … ]

    Ese es el contenido de lista.txt :) son rutas a los archivos que hay que cambiarles los permisos jeje (espero que ahora entiendas mejor mi chapucero código :)

    Respecto al valor de la constante kCHMOD, sí, podría valer 66 :) yo puse un valor muy grande (para no quedarme corto) pero vamos… eso se debería rebajar un poco y no poner 100 a lo bestia como yo XD (ya lo puse en el post. Me daba segmnetation fault’s todo el tiempo y uno ya no sabía ni el por qué XD así que hasta ponía cosas así para cerciorarme de que no era problema con el tamaño de los vectores ;)

    Y nada.. quería hacer una última versión de ‘chapuza’ para que lo de lista.txt no fuese tan estático. Que sacara él mismo la lista de rutas y preguntara al usuario en qué fichero de salida le gustaría tenerlo. No se, un par de funciones y ya está jeje… ya lo haré ;) que aunque no sirve para nada, a mi me ayuda a practicar un poco. Encima me lo paso pipa XDDD

    Gracias por tu visita/comentario. Chao! ;)

  3. on 15 Dic 2003 at 03:53 genisis

    todo es jejeje ckaquer

Trackback URI |