cd digitando apenas o nome do diretório?

58

Eu tive isso em algum lugar há 20 anos ou sonhei com isso.

Basicamente:

Se se blobblobeu receber
blobblob: command not found

Justo.

Gostaria que, quando meu shell obtiver esses erros - comando não encontrado -, verifique se existe um diretório com esse nome ('blobblob') e se ele ocorrer cdnesse diretório.

Tenho certeza de que existem algumas razões para não fazer isso ou fazê-lo com cautela.
Só acho que seria bem legal e gostaria de tentar descobrir como está em algum lugar (como aqui!).

Eu não tenho idéia de como fazer a programação do tipo de shell que isso pode implicar.

Michael Durrant
fonte

Respostas:

76
  • Bater: shopt -s autocd
  • Zsh: setopt autocd
  • tcsh: set implicitcd

Além disso, o 'autojump' é uma ferramenta útil. Uma vez instalado, ele lembra os diretórios, para que você possa digitar j abc e, se você já visitou o abc antes, diga x / d / f / g / t / abc, e ele irá para lá!
https://github.com/joelthelion/autojump

jw013
fonte
11
Sim, eu digitei shopt -s autocdna linha de comando e funcionou. Agora posso começar a digitar os nomes dos diretórios e usar o preenchimento automático e pressionar return e os shell cdno diretório. Tão legal !
22612 Michael Durrant
6
Ótimo. Obrigado por apontar uma falha de funcionalidade para evitar.
vonbrand
3
Eu não uso isso - cdnão é tão difícil de digitar, e a maioria dos mecanismos de preenchimento de guias é mais inteligente quando você fornece mais contexto.
Jw013
Depois de retroceder uma exclamação excessiva de apreciação, deixe-me apenas dizer que autocd é realmente a resposta certa: D
Luc
O autocdshopt foi adicionado na versão 4. do bash. Portanto, ele não está disponível no macOS (que ainda possui a versão 3.xx do bash), a menos que um bash alternativo mais recente esteja instalado (por exemplo, via homebrew).
Quinn Comendant 7/03/2017
2

O utilitário autojump fornece um mecanismo semelhante a uma lista de diretórios Mais Pesadamente Usada. No entanto, exige o tédio adicional da digitação, jSpacemas isso é compensado pela adivinhação correta com mais frequência.

Este é o DWIM mais próximo que eu usei até agora.

msw
fonte
1

Certa vez, criei um script útil para um objetivo semelhante, com uma função fcd para find-n-cd.

Você digita fcd fooe 3 coisas podem acontecer:

  • Nenhum diretório foo é encontrado, então ele retorna com "no such directory " $1
  • Um arquivo foi encontrado: ele testa se é um diretório (ou apenas um arquivo) e, se for o caso, ele faz o cd lá.
  • Vários arquivos são encontrados - em seguida, é apresentada uma seleção, onde você apenas digita o número da seleção (ou um número especial para devolução).

É semelhante, pois não precisa digitar o caminho inteiro, mas você chamou a função explicitamente.

#!/bin/bash
#
# find cd. For input foo, find all directories .../.../foo 
# GPLv3 Stefan Wagner (2010, 2012)
#
# doesn't handle blanks in directory names gracefully.
#
fcd () 
{
    list=$(locate $1 | egrep "/$1$")
    count=$(echo $list | wc -w )
    case $count in 
      0) 
        echo "unknown directory: "$1 && return
        # could search for partial matches Doc => Documentation
        ;;
      1) 
        if [[ -d "$list" ]]; then
        echo "$list";
        cd "$list";
        else
            echo "not a directory: $1"
        fi
        ;;
      *) 
        select directory in $list "/exit/" 
        do
          if [[ "$directory" = "/exit/" ]]; then break; fi
          if [[ -d "$directory" ]]; then
                echo "$directory";
                cd "$directory";
            break
          else
            echo "not a directory: "$1 
          fi
        done     
        ;;
   esac
}

Você tem sourcea função ( source fcd.sh| . fcd.sh) e não pode chamá-la como script, porque cdsó aconteceria no contexto do script e, após o término, você voltaria ao seu diretório inicial imediatamente.

Como funciona locate, é bastante rápido em encontrar diretórios (mas nem sempre atualizados).

Ele não trata espaços em branco nos nomes de diretório normalmente. Se você tiver uma solução elegante para o problema, eu ficaria feliz.

Usuário desconhecido
fonte
11
A questão era cdautomaticamente, sem digitar nenhum comando. Esta resposta é mais adequada para a navegação rápida no diretório no terminal .
manatwork
2
@manatwork: Bem, você pode combinar o comando com o manipulador de erros do bash. Em /etc/bash.bashrchá, no ubuntu, um function command_not_found_handleque olha como se poderia ser modificado.
usuário desconhecido
Entendi. Desta forma, parece muito melhor.
manatwork
@ manatwork: Eu faria isso sozinho, se eu gostaria de usá-lo sozinho. Mas se eu quiser mudar de diretório, eu gostaria de usar um comando curto, mas se eu digitar algo errado, raramente esqueci de digitar 3 ou 4 caracteres. Ter este programa entrado seria um pouco chato para mim, mas usá-lo explicitamente é bom.
usuário desconhecido
1

Isso também funciona,

cdf name_of_file_or_directory

.. desde que você configure um script cdf.sh personalizado (abaixo), fornecido no shell. Para um diretório como parâmetro, esse script chega apenas ao diretório pai do diretório encontrado. Adicione a seguinte linha no seu .bashrc ou .zshrc, o que for ..

source ~/bin/cdf.sh 

E adicione esse código no arquivo ~ / bin / cdf.sh que você precisa criar do zero.

#!/bin/bash

function cdf() {
    THEFILE=$1
    echo "cd into directory of ${THEFILE}"
    # For Mac, replace find with mdfind to get it a lot faster. And it does not need args ". -name" part.
    THEDIR=$(find . -name ${THEFILE} |head -1 |grep -Eo "/[ /._A-Za-z0-9\-]+/")
    cd ${THEDIR}
}
Ville Laitila
fonte
Ótima resposta para uma pergunta antiga. Eu acredito que você vai receber um crachá para reviver uma velha questão, e Welcome to U & L.SE
eyoung100
0

Coloque isso no seu ~/.bashrc

  #aliases to cd into the core dirs
  PROJECT_PARENT_DIRS[0]="$HOME/repos"
  #you can make it search more dirs by assigning new indexes to your other root dirs

  for PARENT_DIR in ${PROJECT_PARENT_DIRS[@]} ; do
    if [ -d "$PARENT_DIR" ]; then
      for PROJECT_DIR in $(/bin/ls $PARENT_DIR); do
        if [ ! -z `which $PROJECT_DIR` ]; then
          continue # don't set alias if there is something already a command on the path with the same name
        fi
        if [ -d "$PARENT_DIR/$PROJECT_DIR" ]; then
          alias "$PROJECT_DIR"="cd $PARENT_DIR/$PROJECT_DIR"
        fi
      done
    fi
  done
  #end alias
Khaja Minhajuddin
fonte