Crie cd automaticamente ls

34

Acho que costumo fazer o seguinte:

%> cd bla/bla
%> ls

Eu gostaria que sempre que eu cd em um diretório ele fizesse um ls .

Eu brinquei com meu .bashrc por um tempo, mas não consegui descobrir como fazer isso acontecer.

    
por RobKohr 09.09.2011 / 19:56

10 respostas

42

Você pode fazer isso com uma função:

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

O && significa ' cd para um diretório e, se for bem-sucedido (por exemplo, o diretório existe), execute ls '. Usar o operador && é melhor do que usar um operador ; ponto-e-vírgula entre os dois comandos, como em { cd "$@" ; ls; } . Esse segundo comando executará ls , independentemente de o cd funcionar ou não. Se o cd falhar, ls imprimirá o conteúdo do seu diretório atual, o que será confuso para o usuário. Como prática recomendada, use && e não ; .

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

Em geral, é uma prática ruim renomear um comando que já existe, especialmente para um comando comumente chamado como cd . Em vez disso, crie um novo comando com um nome diferente. Se você sobrescreve cd com uma função ou alias que também é chamada cd , o que aconteceria quando você digitasse um diretório com 100.000 arquivos? Existem muitos utilitários que usam cd e podem ficar confusos com esse comportamento incomum. Se você usar uma conta compartilhada (como root quando estiver trabalhando com outros administradores do sistema), pode ser muito perigoso substituir um comando existente porque o ambiente é diferente do que as pessoas esperam.

    
por 09.09.2011 / 20:03
32

Eu tenho isso no meu .bashrc e funciona bem.

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

Anteriormente em meu .bashrc eu tenho: [ -z "$PS1" ] && return , e tudo depois dessa linha aplica-se apenas a sessões interativas, portanto isso não afeta como cd se comporta em scripts.

    
por 09.09.2011 / 23:13
7

off-topic, já que a questão é tagged / bash, mas como algumas questões são fechadas como duplicatas desta que não mencionam o bash:

Com zsh:

chpwd() ls

A função chpwd () é chamada por zsh sempre que o diretório atual é alterado (por meio de cd, pushd, popd ...). O tcsh tem um recurso semelhante e é provavelmente de onde o zsh conseguiu isso.

    
por 02.10.2012 / 18:50
2

A solução comum de criação de alias para o comando cd não é perfeita porque existem outros comandos que podem alterar seu diretório atual como popd ou até mesmo executar um script com o comando cd nele.

É melhor usar $ PROMPT_COMMAND Bash hook, que executa um comando antes de retornar um prompt.

O comando (uma função em nosso caso) executará ls somente se o diretório foi alterado para reduzir o ruído da tela. 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
    
por 09.01.2017 / 20:17
1

No bash, você não pode recorrer a aliases para ações que exijam parâmetros. Para isso existem funções. Então coloque em seu ~/.bashrc o seguinte

mycd() {
  cd "$1"
  ls
}
    
por 09.09.2011 / 21:03
0

Ainda mais útil - com a capacidade de voltar ao histórico :

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

Quando você altera o diretório, uma linha com: Stack: (current_dir) (previous_dir) ... será mostrada e, em seguida, ls output. Para voltar no histórico de dirs, apenas insira este comando: popd .

Eu adicionei else , então você verá um erro ao tentar ir para um diretório errado.

    
por 23.10.2016 / 16:49
0

Acho que é bom ativar as opções de ls desta forma, pois cd não tem opção.

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}
    
por 14.02.2017 / 12:45
0

Por que não adicionar um alias ao seu arquivo .bashrc?

Algo como:

alias cdls='cd "$@" && ls'
    
por 16.12.2015 / 14:41
0

Coloque o código abaixo no .profile e ele funciona. Testado na caixa 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"
    
por 20.10.2016 / 18:21
-1
alias cd='builtin cd $1 && ls -l && builtin cd $1'
    
por 17.07.2016 / 05:03