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.

RobKohr
fuente

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.

Stefan Lasiewski
fuente
¿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.

precioso
fuente
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.

Stéphane Chazelas
fuente
4

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

Algo como:

alias cdls='cd "$@" && ls'
Kenneth Aar
fuente
@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
Jack
fuente
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... 
Luciano Andress Martini
fuente
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
}
enzotib
fuente
44
cd "$1" && lsseria mejor.
Gilles 'SO- deja de ser malvado'
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"
usuario196161
fuente
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.

Ctrl-C
fuente
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}
}
iBug
fuente
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
Superlexx
fuente
-1
alias cd='builtin cd $1 && ls -l && builtin cd $1'
joek
fuente
Esto no agrega nada que las otras respuestas aún no hayan cubierto.
jasonwryan