Hacer cd automáticamente ls


47

Me parece que a menudo hago lo siguiente:

%> cd bla/bla
%> ls

Me gustaría que cada vez que ingrese cda un directorio automáticamente haga un ls.

Estuve jugando con mi .bashrcpor un tiempo, pero no pude encontrar la manera de hacerlo realidad.

Respuestas:


51

Puedes hacer esto con una función:

$ cdls() { cd "$@" && ls; }

El &&medio ' cda un directorio, y si tiene éxito (por ejemplo, el directorio existe), ejecute ls'. Usar el &&operador es mejor que usar un punto y coma ;entre los dos comandos, como con { cd "$@" ; ls; }. Este segundo comando se ejecutará lsindependientemente de si cdfuncionó o no. Si cdfalla, lsimprimirá el contenido de su directorio actual, lo que será confuso para el usuario. Como práctica recomendada, use &&y no ;.

$ cdls /var/log
CDIS.custom     fsck_hfs.log    monthly.out     system.log
$ pwd
/var/log

En general, es una mala práctica cambiar el nombre de un comando que ya existe, especialmente para un comando comúnmente llamado like cd. En su lugar, cree un nuevo comando con un nombre diferente. Si sobrescribe cdcon una función o alias que también se nombra cd, ¿qué sucedería cuando ingrese a un directorio con 100,000 archivos? Hay muchas utilidades que utilizan cd, y pueden confundirse por este comportamiento inusual. Si usa una cuenta compartida (como rootcuando está trabajando con otros administradores del sistema), puede ser muy peligroso reemplazar un comando existente porque el entorno es diferente de lo que la gente espera.


¿Ese comando realmente cambia el directorio? De página del manual de bash: "No existe un mecanismo para el uso de argumentos en el texto de reemplazo Si se necesitan argumentos, una función de shell se debe utilizar."
enzotib

@enzotib: Sí, esto realmente cambia el directorio, al menos para mí. Actualicé mi respuesta para mostrar la salida de pwd. No estoy seguro si esta es una mejor práctica, pero se hace comúnmente. Consulte tldp.org/LDP/abs/html/aliases.html para ver algunos ejemplos.
Stefan Lasiewski

2
Primero: no funciona aquí. Segundo: en esa página usan variables, no parámetros posicionales. Tercero: el ABS es una fuente común de malas prácticas.
enzotib

1
El alias funciona para mí en Snow Leopard pero no en CentOS5 o CentOS6. Actualicé mi respuesta para usar solo una función. Sin alias.
Stefan Lasiewski

1
No funciona para mi Intenté la respuesta de @frabjous y funciona: cd() { builtin cd "$@" && pwd; };- utilizando el estándar bourne shell en macOS (Sierra 10.12.6)
Giratorio

39

Tengo esto en mi .bashrc, y funciona bien.

function cd {
    builtin cd "$@" && ls -F
    }

Anteriormente en mi .bashrc tengo:, [ -z "$PS1" ] && returny todo después de esa línea solo se aplica a sesiones interactivas, por lo que esto no afecta el cdcomportamiento de los scripts.


1
¿Qué hace exactamente [ -z "$PS1" ] && return?
sintagma

2
[ -z "$PS1" ]comprueba si la $PS(variable de solicitud interactiva) es "longitud cero" (-z). Si es de longitud cero, esto significa que no se ha configurado, por lo que Bash no debe ejecutarse en modo interactivo. La && returnparte sale del abastecimiento .bashrcen este punto, bajo estas condiciones.
frabjous

1
Otra forma de comprobar la interactividad es buscar ien "$-": case "$-" in *i*) ;; *) return ;; esac.
Kusalananda

@Kusalananda y frabjous: ¿Hay casos en los que uno debería usarse en lugar del otro?
Giratorio

1
@Swivel La PS1variable puede estar desarmada o vacía y el shell aún puede ser interactivo (pero sin un aviso). Lo comprobaría $-para asegurarme.
Kusalananda

13

fuera del tema, ya que la pregunta está etiquetada / bash, pero como algunas preguntas están cerradas como duplicadas de esta, no se menciona bash:

Con zsh:

chpwd() ls

Zsh llama a la función chpwd () cada vez que cambia el directorio actual (por medio de cd, pushd, popd ...). tcsh tiene una característica similar y es probablemente de donde lo obtuvo zsh.


4

¿Por qué no agregar un alias a su archivo .bashrc?

Algo como:

alias cdls='cd "$@" && ls'

@don_crissti Una función y un alias son cosas diferentes. ¿Entonces por qué no?
Jodka Lemon

Esta es la forma más rápida y limpia de hacer lo que solicitó el OP. En mi opinión, las funciones deberían usarse para cosas más complicadas, mientras que hacer atajos para comandos a menudo escritos es exactamente para lo que existen los alias.
Ghos3t

1
Tengo un problema extraño con este alias, cuando lo uso de esta manera, cdls projec2, mostrará todos los archivos en la carpeta del proyecto 2 pero en realidad no cd a esa carpeta, en cambio, permanecerá en la carpeta original.
Ghos3t

Sí, el uso de un alias simplemente enumera los contenidos en ese directorio, pero en realidad no contiene un CD allí.
a3y3

2

La solución común de crear alias para el comando cd no es perfecta porque hay otros comandos que pueden cambiar su directorio actual como popd o incluso ejecutar un script con el comando cd en él.

Es mejor usar $ PROMPT_COMMAND Bash hook que ejecuta un comando antes de devolver un mensaje.

El comando (una función en nuestro caso) ejecutará ls solo si el directorio ha cambiado para reducir el ruido de la pantalla. Código para .bashrc:

    #each console has its own file to save PWD
    PrevDir=$(tty) 
    PrevDir=/tmp/prev-dir${PrevDir////-}
    #don't ls when shell launched
    echo $PWD > $PrevDir
    LsAfterCd() {
        [[ "$(< $PrevDir)" == "$PWD" ]] && return 0

        ll --color=always | sed 1d

        echo $PWD > $PrevDir
    }
    PROMPT_COMMAND=LsAfterCd

2

Copia esto:

altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd 

Ahora solo puedes hacer cd simple:

cd / 
(files listed)
cd /home 
(files listed)
etc... 

1

En bash, no puede recurrir a alias para acciones que requieren parámetros. Para esto hay funciones. Así que pon en tu ~/.bashrcsiguiente

mycd() {
  cd "$1"
  ls
}


Para permitir un parámetro para el comando ls, uso la función mycd {builtin cd $ 1 && ls $ 2}. Ahora puede llamar al comando, por ejemplo, mycd .. -la
Christian Schulzendorff

@ChristianSchulzendorff: mejor usar las comillas: function mycd { builtin cd "$1" && ls "$2" } .
enzotib

No funciona, solo lo intenté. El archivo estaba vacío, pero después de agregar su código, nada cambió.
Negro

0

Coloque el siguiente código en el .profile y funciona. Probado en la caja HP-Unix.

cdl()
{
if [ "$#" = 0 ]; then
cd ~ && ls -ltr
elif [ -d "$@" ]; then
cd "$@" && ls -ltr
else
echo "$@" directory not found!!!
fi
}

#SET YOUR ALIAS TO CD
alias cd="cdl"

0

Aún más útil, con la capacidad de retroceder en la historia :

function cd() {
    if [ -d "$@" ]; then
        echo -n "Stack: "
        pushd "$@"
        ls
    else
        builtin cd "$@"
    fi
}
function popd() {
    builtin popd "$@" && ls
}

Cuando cambie el directorio Stack: (current_dir) (previous_dir) ..., se mostrará una línea con: y luego la lssalida. Para volver atrás en la historia directorios sólo pop este comando: popd.

Agregué elsepara que vea un error cuando intente ir a un directorio incorrecto.


si sólo hacemos cd - que le llevará a su último dir que se encontraba.
Ian

0

Creo que es bueno habilitar lslas opciones de esta manera, ya que cdno tiene opción.

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}

Umm ... cdtoma opciones.
Kusalananda

0

Esto es lo que encuentro útil (en Debian 9):

c() {
    cd "${@}" \
    && ls --color=always -C \
    | sed '
        # on line 5, print the line,
        5 {
            # append an ellipsis
            a[...]
            # and quit
            q
        }
        # print lines 1-4 verbatim
    '
}

Esto me da una salida truncada con puntos suspensivos en caso de que haya demasiados elementos en ese directorio para que la consola se mantenga limpia:

$ c data/git/buildroot/package/
4th                              lua-markdown
a10disp                          lua-messagepack
acl                              lua-msgpack-native
acpica                           luaossl
acpid                            lua-periphery
[...]
$ ls -1 | wc --lines
1977

-1
alias cd='builtin cd $1 && ls -l && builtin cd $1'

Esto no agrega nada que las otras respuestas aún no hayan cubierto.
jasonwryan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.