En la primera parte de esta serie de tutoriales “Ocultando archivos en GNU/Linux“, les había mostrado una pequeña pero funcional aplicación para ocultar archivos en Linux pero en esta parte vamos a ampliar un poco sus funciones agregando una nueva función que realice todo lo contrario a lo que logramos hasta ahora, con esto me refiero a que en vez de ocultar archivos podamos mostrar archivos ocultos, lo cual seria en nuestro caso una herramienta para revertir las acciones realizadas por nuestra función ‘hide‘.

Antes de ponernos a jugar con Python debemos dejar en claro que es lo que queremos lograr tal cual lo hicimos en la primer parte del tutorial, empecemos enumerando las principales funciones que deberá de cumplir nuestro script:

  1. Entra como parámetro un archivo
  2. Si no esta oculto no se realizaría ninguna acción
  3. Si esta oculto quitamos el punto que tiene en el nombre

Como nos daremos cuenta la primera parte se mantiene, la segunda es muy similar a la de la función ‘hide‘ ya creada solamente que esta otra función tiene la diferencia de que verifica que el archivo no se encuentre oculto. Hasta acá es todo muy similar pero la perspectiva nos cambia cuando llegamos al punto 3 de nuestra lista, pero lo mejor es ir un paso a la ves así que lo mejor va a ser empezar por ir a la primer parte de esta lista.

Lo primero que tenemos que hacer es verificar si el archivo o carpeta con la que vamos a trabajar existe, como esto ya lo vimos y aplicamos en la función ‘hide‘ podemos reutilizar un poco su código y a esto lo meteremos en una función a la que llamaremos ‘show‘ que por ahora contendrá lo siguiente:

def show(file):
    import os
    if not os.path.exists(file):
        return

Hasta ahora sabemos que lo que tenemos funciona ya que lo estuvimos probando anteriormente y podemos pasar a la segunda parte de nuestra lista, que se trata de averiguar si el archivo en cuestión se encuentra o no oculto, en este caso les mostrare dos formas de hacerlo pero al final de cuentas seguiremos usando uno solo pero siempre es bueno conocer otras formas de hacer una misma cosa. Nuestro objetivo es ver si nuestro archivo/carpeta no se encuentra oculto y terminar la ejecución de nuestra aplicación, recordemos que el objetivo de esta nueva función es la de quitar el estado oculto a los archivos, para abordar esta situación podemos hacerlo de una forma muy similar a como lo habíamos visto antes con ‘hide‘ lo mejor sera recordar un poco así que a continuación les muestro como lo habíamos hecho:

if archive[0] == '.':
    return

Como se ve en ese caso veíamos si el primer carácter era un punto, en esta otra función debemos ver si el primer carácter no es un punto lo cual nos indicaría que no se trata de un archivo oculto y como lo les había mencionado mas arriba podemos hacerlo de dos formas las cuales se las paso a mostrar a continuación, pero antes tendremos que obtener el archivo en cuestión escribiendo la siguiente linea:

archive = os.path.basename(file)

En este caso usamos la misma forma que ya habíamos utilizado anteriormente, ahora si ya tenemos el archivo con el cual trabajar y podemos continuar con el tutorial pasando a las dos formas que les había mencionado.

 

# Primera forma:
if not archive[0] is '.':
    return

# Segunda forma:
if archive[0] != '.':
    return

 

Por un lado tenemos la primer forma que con un poco de ingles lo podemos leer y nos dirá que si el primer carácter de ‘archive‘ no es un punto terminar la función, en cambio la segunda forma se asemeja mas a la que habíamos usado en ‘hide‘ y usa uno de los operadores de comparación que se dispone con Python, ese signo de exclamación junto con el signo de igual es utilizado en la programación para decir que algo es distinto de, en nuestro caso nos dice que si el primer carácter de ‘archive‘ es distinto de el carácter punto terminar la función. Ahora continuemos que el camino es largo, lo que hicimos por ahora no es muy distinto de lo que habíamos visto en ‘hide‘ y solo nos resta pasar a la tercera parte en donde estará lo mas importante e interesante de este tutorial.

 

3 – Si esta oculto quitamos el punto que tiene en el nombre

Después de un arduo trabajo logramos llegar a la tan preciada tercera parte en donde veremos como ‘desocultar‘ nuestros archivos con Python, en este punto debemos plantearnos lo siguiente que si nosotros detectamos que el archivo esta oculto y borramos el primer carácter puede que hayamos revelado nuestro archivo oculto, pero que pasa si este archivo tenia mas de un punto adelante de su nombre de nada nos hubiese servido quitarle ese primer punto porque el archivo seguiría oculto. En este caso debemos plantearnos una solución mas compleja pero a su vez simple que automatice este proceso de quitar todos esos puntos, para solucionar nuestro problema podemos usar la sentencia ‘while‘ de la siguiente forma:

while archive[0] is '.':
	archive = archive[1:]

Esta es la única parte del tutorial que se nos puede complicar así que intentare ser lo mas claro posible, primero empecemos por leer lo que intenta decirnos la primer linea. En la primer linea lo que vemos es la sentencia ‘while‘, esta es una sentencia de iteracion que nos sirve para tareas repetitivas como en nuestro caso buscar estos puntos, en español ‘while‘ significa ‘mientras‘ y si leemos la primer linea podríamos interpretar algo así:

mientras el primer carácter de ‘archive’ sea ‘.’ hacer esto

Obviamente no pasare a explicar la parte de “archive[0] i ‘.’” por esta la hemos explicado en su momento, el uso de ‘while‘ es muy apropiado para lo que deseamos realizar siempre y cuando lo que le indiquemos que realice sea acorde con lo que necesitamos, antes de terminar de explicar sobre el uso de esta sentencia pasare a explicar la segunda linea.

Cada vez estamos mas cerca de terminar así que si llegaron hasta acá seguro querrán llegar hasta el final, volviendo a donde nos habíamos quedado podemos ver en esa segunda linea que le estamos reasignado un valor a la variable ‘archive‘ que contiene el nombre del archivo con el cual estamos trabajando, este nuevo valor se trata del nombre del archivo quitandole el primer carácter que contiene. Para que se entienda lo pondré en ejemplos, por ejemplo si antes teníamos ‘.firefox‘ nos quedara ‘firefox‘ otro caso seria si teníamos algo así ‘..firefox‘ luego nos quedara ‘.firefox‘ que como vemos lo que hacemos es remover el primer carácter jugando un poco con el indice de los caracteres de la variable, pero para ir cerrando ya esta parte englobemos lo que vimos en estas dos lineas con ejemplos concretos viéndolo con palabras como si fuera un lenguaje natural para que todos lo podamos entender.

Antes que nada hago una pequeña aclaración en este punto el nombre del archivo debe contener un punto porque de lo contrario la función se hubiese abortado previamente con la sentencia ‘return‘ que habíamos visto anteriormente; el primer caso que voy a plantear es cuando el nombre del archivo tiene solo un punto (siempre haciendo referencia al primer carácter), suponiendo que el nombre del archivo es ‘.firefox‘ estas dos lineas actuarían de esta forma:

Primero se ve si el primer carácter es un punto y como lo es ejecuta lo que le indicamos que es quitar el primer carácter que contiene quedando como nuevo nombre ‘firefox‘, esta nueva variable se vuelve a analizar pero en este caso como el primer carácter no es un punto se termina la ejecución quedándonos la variable lista para utilizar mas adelante, fin del primer caso.

Segundo caso, el nombre del archivo contiene mas de un punto como por ejemplo ‘..firefox‘.
En este caso no varia el procedimiento, se ve el primer carácter y como cumple con la condición que le pusimos se procede a quitar el primer carácter y se vuelve a analizar la nueva variable pero en esta el primer carácter sigue siendo un punto por lo tanto vuelve a quitar el primer carácter y se vuelve a analizar el resultado y como ya no contiene un punto se termina el ciclo.

Como se ve en estos dos casos la sentencia ‘while‘ hace todo este proceso repetitivo de forma automática sin intervención de nuestra parte ahorrándonos trabajo, con lo que vimos hasta ahora sobre esta sentencia creo que sera suficiente por hoy, espero haber sido lo suficientemente claro como para podamos continuar sin problemas a la ultima parte.

Hasta ahora si juntamos todo lo que vimos podemos formar algo parecido a esto:

def show(file):
    import os
    if not os.path.exists(file):
        return
    archive = os.path.basename(file)
    directorio = os.path.dirname(file)
    if archive[0] != '.':
        return
    else:
        while archive[0] is '.':
            archive = archive[1:]

Recordemos que la variable ‘archive‘ y ‘directorio‘ ya las habíamos visto en ‘hide‘, con lo vimos hasta ahora ya tenemos el nuevo valor para la variable ‘archive’ y podemos renombrar el archivo en cuestión para que deje de estar oculto pero para esto debemos pasar a la ultima parte de este tutorial, que estamos esperando con ustedes la tan preciada ultima parte.

Como les mencionaba en esta ultima parte nos encargaremos de renombrar el archivo y como se imaginaran no difiere mucho de lo que vimos ya con la función ‘hide‘, así que empiezo por mostrarles como se hace y luego paso a explicar.

newfile = directorio+'/'+archive
os.rename(file, newfile)

Empecemos linea por linea, en la primera tenemos una variable que contendrá la ruta del archivo junto con el nombre modificado de archivo que deseamos desocultar, en este caso seria la unión de la variable ‘directorio‘, mas la barra diagonal y mas el resultado del producto que vimos luego de la sentencia ‘while‘ y por ultimo tenemos que proceso de renombrado donde por un lado ponemos el archivo original y por el otro el de salida, donde el archivo original es el oculto y el de salida seria el archivo sin ocultar.

Con esto doy por finalizado este tutorial sin antes por supuesto colocar la función terminada y completa, el fruto de nuestro esfuerzo:

def show(file):
    import os
    if not os.path.exists(file):
        return
    archive = os.path.basename(file)
    directorio = os.path.dirname(file)
    if archive[0] != '.':
        return
    else:
        while archive[0] is '.':
            archive = archive[1:]
        newfile = directorio+'/'+archive
        os.rename(file, newfile)

Nos estaremos viendo en la próxima entrega de esta serie de tutoriales con la tercera parte “Analizando el estado de los archivos“, pero antes les dejo un pequeño cuadro que les puede ser útil.

[table id=2 /]

 

Unos links que pueden ser útiles

Seguí este post también en:
Snipplr.com
Taringa
Google Docs

Si ves que este post merece alguna modificación sentite libre de hacerlo a través de nuestra Wiki siguiendo el siguiente enlace:
http://wiki.codigopython.com.ar/pyhide:mostrando-archivos-ocultos-en-gnu-linux