Faire un cd automatiquement ls

47

Je trouve que je fais souvent ce qui suit:

%> cd bla/bla
%> ls

Je voudrais que chaque fois que je suis cddans un répertoire, il fait automatiquement un ls.

Je me suis occupé de moi .bashrcpendant un moment, mais je ne savais pas comment y arriver.

RobKohr
la source

Réponses:

51

Vous pouvez le faire avec une fonction:

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

Le &&moyen " cdvers un répertoire, et en cas de succès (par exemple, le répertoire existe), exécutez ls". Il &&vaut mieux utiliser l' opérateur que d'utiliser un ;opérateur en point-virgule entre les deux commandes { cd "$@" ; ls; }. Cette deuxième commande sera exécutée lsindépendamment du cdtravail effectué ou non. En cas d' cdéchec, lsimprimera le contenu de votre répertoire actuel, ce qui déroutera l'utilisateur. En tant que meilleure pratique, utilisez &&et non ;.

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

En règle générale, il est déconseillé de renommer une commande existante, en particulier pour une commande appelée, par exemple cd. Au lieu de cela, créez une nouvelle commande avec un nom différent. Si vous écrasez cdavec une fonction ou un alias également nommé cd, qu'arrivera-t-il lorsque vous entrerez dans un répertoire contenant 100 000 fichiers? Il existe de nombreux utilitaires qui utilisent cd, et ils peuvent être déroutés par ce comportement inhabituel. Si vous utilisez un compte partagé (par exemple rootlorsque vous travaillez avec d'autres administrateurs système), il peut s'avérer très dangereux de remplacer une commande existante car l'environnement est différent de celui attendu par les utilisateurs.

Stefan Lasiewski
la source
Cette commande change vraiment de répertoire? Sur la page de manuel de bash: "Il n'y a pas de mécanisme pour utiliser des arguments dans le texte de remplacement. Si des arguments sont nécessaires, une fonction shell devrait être utilisée"
enzotib
@enzotib: Oui, cela change vraiment de répertoire, du moins pour moi. J'ai mis à jour ma réponse pour afficher le résultat de pwd. Pas sûr que ce soit une bonne pratique, mais c'est couramment fait. Voir tldp.org/LDP/abs/html/aliases.html pour quelques exemples.
Stefan Lasiewski
2
D'abord: ça ne marche pas ici. Deuxièmement: dans cette page, ils utilisent des variables, pas des paramètres de position. Troisièmement: l'ABS est une source commune de mauvaises pratiques.
enzotib
1
L'alias fonctionne pour moi sur Snow Leopard mais pas sur CentOS5 ou CentOS6. J'ai mis à jour ma réponse pour utiliser une fonction uniquement. Pas d'alias.
Stefan Lasiewski
1
Ca ne marche pas pour moi Essayé réponse @frabjous et cela fonctionne: cd() { builtin cd "$@" && pwd; };- en utilisant shell standard bourne sur macOS (Sierra 10.12.6)
Swivel
39

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" ] && returnet tout ce qui suit ne concerne que les sessions interactives, donc cela n’affecte pas le cdcomportement des scripts.

frabjous
la source
1
Qu'est-ce que fait exactement [ -z "$PS1" ] && return?
syntagma
2
[ -z "$PS1" ]vérifie si $PS(variable d'invite interactive) est "longueur zéro" (-z). Si sa longueur est égale à zéro, cela signifie qu'il n'a pas été défini. Bash ne doit donc pas être exécuté en mode interactif. La && returnpièce quitte le sourcing .bashrcà ce stade, dans ces conditions.
frabjous
1
Une autre façon de vérifier l' interactivité est de rechercher idans "$-": case "$-" in *i*) ;; *) return ;; esac.
Kusalananda
@Kusalananda & frabjous: Existe-t-il des cas où l'un devrait être utilisé à la place de l'autre?
Pivot
1
@Swivel La PS1variable peut être non définie ou vide et le shell peut toujours être interactif (mais sans invite). Je vérifierais $-pour être sûr.
Kusalananda
13

hors sujet, puisque la question est marquée / bash, mais que certaines questions sont fermées comme une copie de celle-ci sans mentionner bash:

Avec zsh:

chpwd() ls

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

Stéphane Chazelas
la source
4

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

Quelque chose comme:

alias cdls='cd "$@" && ls'
Kenneth Aar
la source
@don_crissti Une fonction et un alias sont des choses différentes. Alors pourquoi pas?
Jodka Lemon
C'est le moyen le plus rapide et le plus propre de faire ce que le PO a demandé. À mon avis, les fonctions devraient être utilisées pour des choses plus compliquées, alors que créer des raccourcis pour des commandes souvent typées correspond exactement aux alias existants.
Ghos3t
1
J'ai un problème étrange avec cet alias, lorsque je l'utilise comme ceci, cdls projec2, il affichera tous les fichiers du dossier du projet 2 mais pas réellement cd dans ce dossier, mais restera dans le dossier d'origine.
Ghos3t
Oui, utiliser un alias ne fait que répertorier le contenu de ce répertoire, mais n'y est pas réellement inséré.
a3y3
2

La solution habituelle consistant à créer un alias pour la commande cd n’est pas parfaite, car il existe d’autres commandes qui peuvent modifier votre répertoire actuel, comme Popd, ou même l’exécution d’un script contenant la commande cd.

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

La commande (une fonction dans notre cas) ne sera exécutée que si le répertoire a été modifié pour réduire le bruit d'é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
Jack
la source
2

Copier 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... 
Luciano Andress Martini
la source
1

En bash, vous ne pouvez pas avoir recours à des alias pour les actions nécessitant un paramètre. Pour cela, il y a des fonctions. Alors mettez dans ~/.bashrcle suivant

mycd() {
  cd "$1"
  ls
}
enzotib
la source
4
cd "$1" && lsserait mieux.
Gilles 'SO- arrête d'être méchant'
Pour autoriser un paramètre pour la commande ls, j'utilise la fonction mycd {builtin cd $ 1 && ls $ 2}. Maintenant, vous pouvez appeler la commande, par exemple mycd .. -la
Christian Schulzendorff
@ChristianSchulzendorff: mieux utiliser les guillemets: function mycd { builtin cd "$1" && ls "$2" } .
enzotib
Ne fonctionne pas, je l'ai juste essayé. Le fichier était vide, mais après avoir ajouté votre code, rien n'a changé.
Noir
0

Placez le code ci-dessous dans le fichier .profile et cela fonctionne. Testé sur 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"
utilisateur196161
la source
0

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 lssortie. Pour revenir dans l' histoire dirs pop juste cette commande: popd.

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

Ctrl-C
la source
si vous faites juste cd - cela vous amènera à votre dernier répertoire dans lequel vous étiez.
Ian
0

Je pense qu’il est bon d’activer lsles options de cette manière, car cela cdne prend aucune option.

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}
iBug
la source
Umm ... cdprend des options.
Kusalananda
0

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
Superlexx
la source
-1
alias cd='builtin cd $1 && ls -l && builtin cd $1'
joek
la source
Cela n'ajoute rien que les autres réponses n'ont pas déjà couvert.
jasonwryan