web-dev-qa-db-fra.com

Créer un cd automatiquement ls

Je trouve que je fais souvent ce qui suit:

%> cd bla/bla
%> ls

Je voudrais que chaque fois que je cd dans un répertoire, il fasse automatiquement un ls.

J'ai tripoté mon .bashrc pendant un certain temps, mais je n'ai pas réussi à comprendre comment y arriver.

51
RobKohr

Vous pouvez le faire avec une fonction:

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

Le && signifie 'cd dans un répertoire, et en cas de succès (par exemple, le répertoire existe), exécutez ls'. En utilisant le && il vaut mieux utiliser un point-virgule ; opérateur entre les deux commandes, comme avec { cd "$@" ; ls; }. Cette deuxième commande exécutera ls, que cd ait fonctionné ou non. Si cd a échoué, ls affichera le contenu de votre répertoire actuel, ce qui sera déroutant pour l'utilisateur. Comme meilleure pratique, utilisez && et pas ;.

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

En général, il est déconseillé de renommer une commande qui existe déjà, en particulier pour une commande communément appelée comme cd. Au lieu de cela, créez une nouvelle commande avec un nom différent. Si vous remplacez cd par une fonction ou un alias également nommé cd, que se passerait-il lorsque vous entrez dans un répertoire contenant 100 000 fichiers? Il existe de nombreux utilitaires qui utilisent cd, et ils peuvent être déconcertés par ce comportement inhabituel. Si vous utilisez un compte partagé (tel que root lorsque vous travaillez avec d'autres administrateurs système), il peut être très dangereux de remplacer une commande existante car l'environnement est différent de ce à quoi les gens s'attendent.

54
Stefan Lasiewski

J'ai ceci dans mon .bashrc, et cela fonctionne très bien.

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

Plus tôt dans mon .bashrc, j'ai: [ -z "$PS1" ] && return, et tout ce qui se trouve après cette ligne ne s'applique qu'aux sessions interactives, donc cela n'affecte pas le comportement de cd dans les scripts.

42
frabjous

hors sujet, puisque la question est taguée/bash, mais comme certaines questions sont fermées en double de celle-ci qui ne mentionne pas bash:

Avec zsh:

chpwd() ls

La fonction chpwd () est appelée par zsh chaque fois que le répertoire courant change (via cd, pushd, popd ...). tcsh a une fonctionnalité similaire et est probablement d'où zsh l'a obtenu.

16

Pourquoi ne pas ajouter un alias à votre fichier .bashrc?

Quelque chose comme:

alias cdls='cd "$@" && ls'
4
Kenneth Aar

Copiez ceci:

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

Maintenant, vous pouvez simplement faire un cd simple:

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

La solution courante de création d'alias pour la commande cd n'est pas parfaite car il existe d'autres commandes qui peuvent changer votre répertoire actuel comme popd ou même exécuter un script avec la commande cd.

Il est préférable d'utiliser le hook $ Prompt_COMMAND Bash qui exécute une commande avant de renvoyer une invite.

La commande (une fonction dans notre cas) n'exécutera ls que si le répertoire a changé pour réduire le bruit à l'écran. Code pour .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
Jack

Dans bash, vous ne pouvez pas revenir aux alias pour les actions qui nécessitent un paramètre. Pour cela, il existe des fonctions. Alors mettez votre ~/.bashrc le suivant

mycd() {
  cd "$1"
  ls
}
1
enzotib

Placez le code ci-dessous dans le .profile et cela fonctionne. Testé sur la boîte 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
user196161

Je pense qu'il est bon d'activer les options de ls de cette manière car cd ne prend aucune option.

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

Encore plus pratique - avec la possibilité de remonter dans l'histoire:

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

Lorsque vous changez de répertoire, une ligne avec: Stack: (current_dir) (previous_dir) ... sera affichée, puis ls sortie. Pour revenir dans l'historique des répertoires, il suffit de faire apparaître cette commande: popd.

J'ai ajouté else afin que vous voyiez une erreur lorsque vous essayez d'accéder à un mauvais répertoire.

0
Ctrl-C

Voici ce que je trouve utile (sur 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
    '
}

Cela me donne une sortie tronquée avec des points de suspension au cas où il y aurait trop d'éléments dans ce répertoire pour que la console reste propre:

$ 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
0
Superlexx