Tip extremadamente útil si usas la terminal (Unir comando CD con LS … y muchos más)

Soy de los que usa gran parte del tiempo la terminal (consola, bash, shell, como quieran llamarle), por X o Y motivos tengo que estar constantemente cambiando de directorio, trabajando en ella 🙂

En la gran mayoría de los casos, cambio de directorio (Por ejemplo: cd /opt/) y además deseo saber qué se encuentra en ese directorio, para saber esto segundo hago uso de ls.

O sea, sería así:

kzkggaara@geass:~$ cd /opt/
kzkggaara@geass:/opt/$
kzkggaara@geass:/opt/$ ls
nessus

Muchas veces lo he dicho… soy bastante vago, me gusta hacer la menor cantidad de pasos en terminal, por eso es que luego de bastante experimentar, he logrado justo lo que quería.

Vean lo siguiente, que no es más que yo entrando a /opt/ con el simple comando cd /opt/:

Como pueden ver, en un solo paso (cd /opt/) entro al directorio y ADEMÁS me lista el contenido de ese directorio, y… por si fuera poco, me lo muestra con colores 😀

Aquí el ejemplo de yo accediendo a /etc/ con cd /etc/ :


Los colores son simples de entender:

Sin color = Archivos
Color azul = Carpetas
Color verde = Archivos con permisos de ejecución

Pero, pasemos a lo principal… ¿cómo demonios usando solamente cd puedo además automáticamente listar el directorio al que accedo?

Nuestro archivo .bashrc (ubicado en nuestro home o carpeta personal) nos ayudará a hacer esto, primero debemos declarar una función, a la que llamaremos cdls:

function cdls { cd «$1»; ls –color;}

Esta línea la ponemos en cualquier lado de nuestro .bashrc … aquí les dejo el comando para hacerlo:

echo "" >> $HOME/.bashrc && echo "function cdls { cd "$1"; ls --color;}" >> $HOME/.bashrc

NO necesariamente tienen que hacerlo con este comando, el objetivo es que el archivo .bashrc contenga esta línea, así que simplemente editen este archivo con su editor de texto preferido (mousepad, kate, gedit, nano, vi, etc) y la agregan.
Guardan el cambio, cierran la terminal que tengan abierta y abren una nueva.

En ella escribiremos lo siguiente y presionamos [Enter]:

cdls $HOME

Esto deberá bastar para acceder a nuestra carpeta personal en esa terminal, y además nos listará el contenido de ella (con colores y todo).

O sea, que cdls ya hace lo que queremos… ahora solo nos queda lograr lo mismo pero con cd

Para esto, agregamos en el archivo .bashrc la siguiente línea:

alias cd='cdls'

Esto hará que cuando escribamos cd … en realidad se ejecutará la acción que definimos para cdls

Les dejo el comando que pondrá automáticamente esta línea anterior:

echo "" >> $HOME/.bashrc && echo "alias cd='cdls'" >> $HOME/.bashrc

Pero igual como les dije antes, el objetivo es agregar esta otra línea el mismo archivo, pueden usar el editor de texto de su preferencia para ello.

Una vez hecho esto, cierren la terminal y abran una nueva… en ella escriban lo siguiente y presionen [Enter]:

cd /etc/

Y bingo, entrarán a /etc/ y además se les listará el contenido de esta carpeta, y con colores 😉 (justo como en una foto anterior)

¿A que es útil? 😀

Para los curiosos que se preguntan ¿qué significa esa función? … les dejo la simple explicación:

function cdls = Aquí definimos que estamos creando una nueva función, y se llamará cdls
cd «$1» = Y esta función lo que hará (hará cada vez que la llamemos, usemos o ejecutemos) será hacer un cd (entrar) hacia el 1er parámetro, o sea… -» «cd /home/», el «$1» significa «lo que escribamos luego de cd», en este ejemplo el 1er parámetro es «/home/».
; = Esto significa que ahí termina esa orden, o acción a ejecutar… pero una función puede tener más acciones a hacer, y le definiremos una segunda ahora.
ls –color; = Significa que además de cualquier acción declarada antes, también hará un «ls» en donde estemos ubicados, y el «ls» lo hará con color (–color).

Ultima cosa… los más listos, se darán cuenta que esta lógica (tomar una función y configurarla para que ejecute varias acciones) tiene mucho pero mucho potencial, por ejemplo… si quiero entrar a una carpeta, y además borrar otra, o sea, quiero entrar a /home/ y además borrar /opt/temp/ la función para ello sería:

function asdasd { cd "$1"; rm -Rv "$2"; }

Y escribiendo en una terminal asdasd /home/ /opt/test/ lo haría, porque entrará al 1er parámetro (/home/) y borrará el segundo (/opt/temp/).

En fin, de veras esto tiene MUCHO potencial jeje, queda por parte de ustedes aprovecharlo lo más que puedan.

Si tienen alguna duda o pregunta, queja o sugerencia con mucho gusto les echo una mano, no soy ni de lejos un experto pero al menos me gusta ayudar 😀

Saludos


54 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   Blablabla dijo

    Y todo esto por no usar Zsh.

    1.    KZKG^Gaara dijo

      En realidad no lo conocía 😉
      Gracias por el dato, le echaré un ojo.

      No obstante, el conocimiento no ocupa lugar… mientras más tips y conocimientos uno logre adquirir, será mejor ¿no lo crees? 🙂

      1.    msx dijo

        Zsh es de maricas, los hombres usan sh!!! >:D

        En realida

        1.    KZKG^Gaara dijo

          HAHAHA no no no… no lo creo, y tampoco lo digas así, porque se podrían sentir algunos ofendidos.
          Cada cual usa lo que más le conviene, lo que más le gusta 😀

          1.    msx dijo

            😉

            Una app que uso mucho para navegar por mi sistema es Autojump:
            https://github.com/joelthelion/autojump/blob/master/README.md

        2.    Blablabla dijo

          Los hombres son prácticos, las mujeres y los maricas son a quienes les gusta complicarse la vida. No hace falta dar más aclaraciones.

          1.    KZKG^Gaara dijo

            Por favor, intentar no hacer comentarios sobre preferencias sexuales si? … han habido situaciones incómodas por este tipo de cosas.

            Espero se entienda.

          2.    Blablabla dijo

            Esa aclaración debería ser para @msx. las ideas se construyen con aseveraciones verídicas, objetivas y racionales, no con insultos o groserías.

            1.    KZKG^Gaara dijo

              En el comentario mío de más arriba le dije que no dijera esas cosas (valga la redundancia).
              Y ahora lo vuelvo a decir sí, pero no dirigido a tí solamente en específico, es válido para todos y todas.

              No te lo tomes a mal, la intención no era hacer sentir a nadie incómodo o mal, solo intento evitar malentendido 🙂


          3.    Martin dijo

            Hahaha, recién veo este comentario!

            «Esa aclaración debería ser para @msx. las ideas se construyen con aseveraciones verídicas, objetivas y racionales, no con insultos o groserías.»
            Dejá de desayunarte con limones man que ya estás igualito a Franklin en el billete de u$s100: http://www.watchingamerica.com/frankfurterallgemeine000009.shtml

            😀

        3.    abel dijo

          ¿zsh es de maricas?, bueno creo que me gusta ser marica entonces por que desde que aprendi a usarlo no lo he dejado ni pienso hacerlo. o_____o

          ¿Los hombres usan sh?, es raro ese comentario viniendo de alguien que tiene el bashrc lleno de cosas, asi que supondre que eres mujer. xP

          1.    KZKG^Gaara dijo

            A esto es a lo que no quería llegar. Por favor, dejemos acá la pelea si? 🙂
            Cada cual usa lo que quiera… sh, zsh, o lo que quiera, y además… cada cual tiene las preferencias sexuales que desee tener, ya han habido peleas acá por cosas así 🙁

          2.    msx dijo

            hahaha xD

            Ultimamente evolucionó mucho zsh, ni bien tenga tiempo -ja, que iluso!- voy a leer lo más que pueda de su documentación para sacarle provecho y hago el cambiazo 🙂

            Ahora hablando en serio: lo único que me jode un poquitín de zsh es que no es 100% compatible con Bash, entonces si usamos zsh en nuestro scripts sacándole todo su potencial, es muy pero muy posible que dicho script falle en bash, por otro lado, si aunque usemos zsh escribimos nuestros shell scripts en bash es un desperdicio estar usando zsh… o_O

            Así y todo creo que zsh vale la pena. Hablando de shell, conocen Fish? El proyecto resurgió de sus cenizas, ahora se llama fishfish y lo estan desarrollando muy rápido.

    2.    hackloper775 dijo

      Yo pienso que se debe escribir zsh ya que la terminal es muy sensible con las minusculas y mayusculas

      Aunque también se vale cd && ls /ruta

      Aunque es mas largo de escribir

      Saludos 😀

      1.    hackloper775 dijo

        Me equivoque se me fue el dedo

        Puse que con esto se lista y se accede a un directorio

        cd && ls /ruta

        pero solo se lista

        aunque para solo listar se usa

        ls /ruta

        el comando que es el equivalente es

        cd /ruta && ls

        Saludos

        1.    KZKG^Gaara dijo

          En efecto, usando && se logra lo mismo 😀
          La única diferencia es que «cd /opt/ && ls» tiene 6 caracteres más que simplemente «cd /opt/», o sea, tendría que presionar 6 teclas más ^-^U … soy algo vago para cosas así de simple jeje.

          Es por eso que uní el cd + ls … LOL!!

          1.    hackloper775 dijo

            Lo que también uso es que filtro los resultados por extensiones.

            Ejemplo

            Tengo muchos archivos en ~/Descargas mas de 100 y solo quiero ver los .png para hacer esto hago

            cd Descargas && ls *png

            ¿Que tendría que añadir o hacer para filtrar los resultados en un código mas simple?

            Saludos

            1.    KZKG^Gaara dijo

              Simple 😉
              Creas una función que sea por ejemplo, cdlsf:
              function cdlsf { cd "$1"; ls *.$2; }

              Para usarla sería:
              cdlsf /opt/ png

              Y esto te listará solo los archivos .png en /opt/
              O sea, el 1er parámetro (en el ejemplo /opt/) sería el directorio al que quieres acceder, y el 2do parámetro (en el ejemplo png) sería la extensión que deseas filtrar cuando listas el directorio.

              Otro ejemplo, si quieres entrar a /home/usuario/Pictures y ver solamente los archivos que sean .JPG, sería:
              cdlsf /home/usuario/Pictures jpg

              😀

              Esto era lo que querías no?

              PD: Pongo cdlsf por cd(entrar)ls(listar)f(filtrar) … pero la función obviamente la puedes llamar como quieras.


    3.    eVeR dijo

      zsh no es POSIX, y para colmo tarda mas en iniciar, así que prefiero ser marica, pero mas eficiente

      1.    Blablabla dijo

        Primero, en zsh se puede activar compatibilidad con POSIX. Segundo, tarda en iniciar de acuerdo a cuantas funciones cargue al inicio, entonces puede ser tan ligero como uno quiera. Tercero, con zsh uno es más práctico y eficiente que con cualquier otro shell. Cuarto, úselo antes de criticar.

        1.    msx dijo

          5to. Cuando activás la compatibilidad POSIX deja de tener sentido usar ZSH.

          Lo estuve usando un rato, no vale la pena, sh se corto y Bash es perfecto, no hay nada que no puedas hacer en Bash con los alias y funciones adecuadas.

  2.   Marco dijo

    me gusta mucho el tema. de hecho, deberían crear algún artículo más extenso sobre los comandos que se pueden utilizar en general en la terminal, y en distros específicas, como Chakra.

  3.   Ridal dijo

    Me ha parecido muy interesante ya que aparte de enseñar este truquillo, has explicado como funciona cada comando.

    Os llevo siguiendo desde que empece en el mundillo linux (no hace mucho…) y me he animado a comentar solo para felicitarte por el articulo 😉

    1.    KZKG^Gaara dijo

      Gracias a tí por pasarte y dejarnos el comentario 😀
      Siempre que me aventuro a explicar algo, me gusta dejarlo tan claro como sea posible… pues, yo sé muy bien lo que es leer tutoriales en internet y no entender nada de nada jajaja.

      Bienvenido doblemente… bienvenido al mundillo del Tux jaja, y además bienvenido al blog 🙂
      Si tienes alguna duda ya sabes, nos dejas saber jeje.

      Saludo y gracias por el comentario ^⁻^

  4.   Ivan dijo

    Acabo de leer tu entrada desde otro sitio web, y no he podido resistirme:

    No seria mas fácilmente, simplemente crear dentro del .bashrc un alias?

    alias cd=’ls’

    1.    KZKG^Gaara dijo

      En realidad lo que intento lograr es entrar a un directorio X (/opt/ … /home/usuario/ … el que sea) y además cuando entre en él, automáticamente me liste el contenido de ese directorio.

      Que sea todo con 1 solo paso o comando.

      Haciendo un alias como indicas, entonces me listaría el directorio sí, pero no entraría en él.

      1.    Ivan dijo

        Por lo que entiendo, el objetivo de realizar todo esto, es que si quieres por ejemplo entrar a «/etc» por medio del comando «cd», al entrar, automáticamente te muestre el contenido de dicho directorio, ¿cierto?

        Si es así, puedes simplificar la función en un «alias», donde dentro del .bashrc colocas:

        alias cd=»ls»

        Con esto, cuando en una terminal utilices:

        cd /etc

        Entraras al directorio «/etc» y ademas automáticamente te listara todos los archivos y directorios que estén ahí dentro.

        Si entendí mal el objetivo, una disculpa 😛

        1.    KZKG^Gaara dijo

          En efecto, quiero entrar a un directorio y una vez dentro que liste lo que contenga.
          Intenté lo que dices, declarando que cd = ls mediante un alias, pero no me resultó.
          Lo configuro así mismo, y luego hago:
          cd /etc/

          Pero me lista /etc/ … mas no entra a ese directorio.
          Dejo un screenshot para que veas: http://img204.imageshack.us/img204/5272/cdlserror.png

          1.    Ivan dijo

            Mi error 😀

            Era obvio que no iba a funcionar de esa manera, y aun cuando intente con un:

            alias cdls=’cd $1;ls’

            Por alguna extraña razón no funciona, simplemente lista el directorio pero no entra en el D:

            Bash error? xD

            Una disculpa por los comentarios sin sentido! 😀 Y me llevo la función para mi bashrc 😛

            1.    KZKG^Gaara dijo

              Es que un alias no es lo mismo que una función, un alias si quieres que sea igual a varios comandos, tienes que obligatoriamente usar && … no es como en las funciones, que usando ; y escribiendo más instrucciones te resultará.

              HAHA nah para nada amigo, nada que disculpar 😀
              Saludos

              PD: … joder… que nostalgia me entra cuando veo el logo de Arch …. T_T


          2.    Ivan dijo

            Se que no es lo mismo pero me imagine que funcionaria (Error :P)

            Solo que a mi si me funciona el utilizar «;» en lugar de «&&» dentro de un alias D: (Tengo dos alias así, lo que no entiendo es por que no funciona con el alias que quise crear para este caso)

            Gracias y por cierto, creo que me quedare en el blog bajo el titulo de «lector frecuente» 😀 Me gusto mucho el contenido del blog 😛

            oooh si lo se, yo me separo a veces de mi querido Arch pero, no se porque, siempre me es imposible no regresar a el xD

            Saludos!

            1.    KZKG^Gaara dijo

              Bueno… Tux es misterioso, hace las cosas y muchas veces no le entendemos, pero tiene un plan o propósito para todos… JAJA 😀

              Un placer leer lo que dices, otro usuario más de Arch que se suma al blog jajajaja… todo un placer 😀

              Yo lo tuve que dejar de usar por problemas rarísimos que me daba el kernel… pero aún ocupa un lugar en mi corazón 🙁


          3.    Ivan dijo

            jajajaja

            No he conocido usuario de Arch que no le tome un gran cariño a la distribución, tiene un «no se que, que que se yo» :P, igual y si los problemas que te daba fueron hace tiempo podrías pensar en volver a Arch 😀

            Por cierto, yo sabia que en alguno otro lugar ya había leído tu nombre (bueno, nick, seudónimo, apodo, whatever), eres parte de los redactores de arteescritorio, no? 🙂
            Solía leerles 🙂

  5.   Hugo dijo

    En realidad para listar el contenido de un directorio no es necesario entrar en el, de modo que no creo que el ejemplo que has escogido sea el más feliz, jeje. Dicho esto, las funciones sí se pueden usar para muchas cosas útiles.

    Por ejemplo, yo uso esta función para crear un directorio y entrar en el inmediatamente (validando que se utilice solo un parámetro):

    function mkcd () {
    FNERR="Parametros incorrectos.\nUso: mkcd "
    if [ $# -eq 1 ] ; then
    mkdir -p "$1" && cd "$1"
    else
    echo -e $FNERR
    fi
    }

    1.    Hugo dijo

      Hmmm… el blog se comió parte del comando, intentaré poner la línea incompleta con etiquetas HTML:

      FNERR="Parametros incorrectos.\nUso: mkcd <nombre del directorio a crear>"

    2.    KZKG^Gaara dijo

      Lo que quería lograr era ahorrarme un paso.
      O sea, supongamos que quiero entrar a un directorio (/etc/squid/) para entonces editar un archivo en ese directorio, y no recuerdo el nombre del archivo.

      Los pasos normalmente serían:
      cd /etc/squid/
      ls
      nano archivo.conf

      Pero, con este tip que propongo, me convierte los 2 primeros pasos en 1 solo, de modo que simplemente haciendo:
      cd /etc/squid/

      Automáticamente me listará también el contenido del directorio.
      Se trata simplemente de ahorrarnos un paso 😀

      ¿Me entiendes?

      … es que me cuesta explicarme jaja.

      1.    Hugo dijo

        No, la explicación no tenía ningún problema, me refería a que quizás el ejemplo que escogiste para ilustrar el tip no fue el ideal, dado que uno puede hacer un simple «ls directorio».

        En realidad en cuanto vi la función entendí el propósito. Yo también uso varias funciones en mi .bash_aliases, por ejemplo, esta es una que uso bastante para gestionar el historial:

        h () {
        if [ $# -eq 0 ] ; then
        history | tail -n 25 | less
        elif [ $# -eq 1 ] ; then
        history | egrep -i "$1" | less
        else
        echo -e "Parametros incorrectos."
        fi
        }

        (Con esta función, si solo pongo h me salen los últimos 25 comandos, pero si por ejemplo pongo h mount me salen los últimos comandos relacionados con montajes).

        1.    KZKG^Gaara dijo

          Me llevo tu función jejeje… merece estudiarla 😀

        2.    Anibal dijo

          genial tu funcion ! gracias

        3.    msx dijo

          +1

  6.   hackloper775 dijo

    KZKG^Gaara

    Muy buena respuesta me sirvió muy bien, ya no pude responder aya arriba

    Ahora usare cdlsf para aumentar mi productividad,muy buen nombre para un comando 😀

    Saludos

  7.   Christopher Castro dijo

    Como le haces para ponerle la hora a la terminal, ya lo había hecho yo antes era un bashrc que descargue pero no recuerdo como se llamaba.

  8.   abel dijo

    Buena entrada, no conocia el truco, lo pondre en practica a ver que tal. xP

    Saludos.

    1.    abel dijo

      Seria bueno que mi navegador fuera agregado. xD

      Saludos, de nuevo. xD

      1.    KZKG^Gaara dijo

        Qué navegador usas?
        Pues en otro comentario ví que usabas Firefox 🙂

        1.    abel dijo

          Si, uso Firefox pero cada vez es menos y esta dejando de ser mi navegador principal, estoy usando dwb y seria bueno que pudiera ser agregado. xP

          Saludos.

  9.   Guillermo dijo

    Y hacer este alias no dara problemas en scripts al intentar hacer cd simplemente y dar adeams la salida de ls? yo particularmente prefiero hacer alias con nombres que no usen otros ejecutables, porque no es la primera vez que me da problemas…

  10.   yrigol dijo

    ¿Cómo logras las lineas discontinuas y la hora después de cada comando?

  11.   msx dijo

    Mi aporte:
    alias ldir=’ls | grep -v \\.’ ## lista solamente los directorios (ojo, no lo renombre a ld ya que hay comando de GNU/Linux con ese nombre)

    alias ll=’ls -lah –color | awk ‘\»{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'\'''

    Lo interesante de este alias es el awk que parsea la salida del ls, resultado? Muestra los permisos de archivos en formato octal al lado de rwx, para mi infinitamente más práctico y rápido que las letras.


    alias lg='ls -lah –color | awk '\''{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'\''|grep -i'

    Variante del alias de arriba. Le agregué un grep al final para que de esta forma cuando haga por ejemplo:
    $ lg zip
    Me muestre solamente los archivos que contenga zip en cualquiera de sus formas (noten el -i del final) además de los permisos octales, etc.

    alias grep='grep –color=auto' ## colorea el matcheo de grep

    Tengo muchos más para compartir pero se me hace apretado este lugarcito xD

    @KZKG, Staff: les parece abrir un post en el blog o en el foro (al que linkeemos cada vez que se publica algún tip relacionado a la consola) para ir juntando todas estas perlitas?

    Saludos!

    1.    KZKG^Gaara dijo

      Con lo de link te refieres a este? -» https://blog.desdelinux.net/tag/bash

  12.   msx dijo

    No dije nada, no hace falta nada de lo demás, está todo perfectamente taggeado!

  13.   Franklin Rodríguez dijo

    Que chilero, muy buena función esa!