cd apenas digitando o nome do diretório?

55

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

Basicamente:

Se se digitar blobblob , recebo blobblob: command not found

Feira suficiente.

Eu gostaria que, quando meu shell obtivesse esses erros - comando não encontrado - ele verifique se existe um diretório com esse nome ('blobblob') e se ele faz isso cd nesse diretório.

Tenho certeza que existem algumas razões para não fazer isso ou fazer isso com cautela.
Eu só acho que seria muito legal e eu gostaria de tentar descobrir como em algum lugar (como aqui!).

Eu não tenho ideia de como fazer a programação do shell que isso pode implicar.

    
por Michael Durrant 24.04.2012 / 04:16

5 respostas

73
  • Bash: 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ê visitou o abc antes, digamos x / d / f / g / t / abc então ele irá cd para lá!
link

    
por 24.04.2012 / 04:19
2

O utilitário autojump fornece um mecanismo semelhante à lista de diretórios mais utilizados. No entanto, isso requer o acréscimo de tédio de digitar j Espaço , mas isso é compensado pela adivinhação mais frequente do que não.

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

    
por 23.04.2014 / 01:14
1

Uma vez eu fiz um script útil para um propósito similar, com uma função fcd para find-n-cd.

Você digita fcd foo e 3 coisas podem acontecer:

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

É semelhante em que não precisa de você para digitar o caminho inteiro, mas você chama 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 que source da função ( source fcd.sh | . fcd.sh ) e não pode chamá-la como script, porque cd só aconteceria no contexto do script, e depois de terminar você aconteceria estar de volta ao seu diretório inicial imediatamente.

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

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

    
por 27.04.2012 / 13:07
1

Isso também funciona,

cdf name_of_file_or_directory

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

source ~/bin/cdf.sh 

Adicione esse código ao 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}
}
    
por 10.09.2014 / 16:01
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
    
por 30.04.2012 / 19:37