cd semplicemente digitando il nome della directory?


58

O l'ho avuto da qualche parte 20 anni fa o l'ho sognato.

Fondamentalmente:

Se se tipo blobblobottengo
blobblob: command not found

Giusto.

Mi piacerebbe che quando la mia shell ottiene quegli errori - comando non trovato - controlla se esiste una directory con quel nome ('blobblob') e se lo fa cdin quella directory.

Sono sicuro che ci sono alcuni motivi per non farlo o farlo con cautela.
Penso solo che sarebbe abbastanza carino e vorrei provarlo scoprendo come da qualche parte (come qui!).

Non ho idea di come fare questo tipo di programmazione della shell ciò potrebbe implicare.

Risposte:


76
  • bash: shopt -s autocd
  • zsh: setopt autocd
  • tcsh: set implicitcd

Inoltre, "autojump" è uno strumento utile. Una volta installato, ricorda le directory in modo che tu possa digitare j abc e se hai già visitato abc prima, dì x / d / f / g / t / abc, allora farà cd lì!
https://github.com/joelthelion/autojump


1
Sì, ho digitato shopt -s autocdalla riga di comando ha funzionato. Ora posso solo iniziare a digitare i nomi delle directory e utilizzare il completamento automatico, quindi premere Invio e la shell cdnella directory. Così bello!
Michael Durrant,

6
Grande. Grazie per aver segnalato un malfunzionamento da evitare.
vonbrand,

3
Non lo uso - cdnon è così difficile da scrivere, e la maggior parte dei meccanismi di completamento delle schede sono più intelligenti quando dai loro più contesto.
jw013,

Dopo aver sostituito un'eccessiva esclamazione di apprezzamento, vorrei solo dire che autocd è davvero la risposta giusta: D
Luc

Lo autocdshopt è stato aggiunto in bash versione 4. Quindi non è disponibile su macOS (che ha ancora bash versione 3.xx) a meno che non sia installato un bash alternativo e più recente (ad es. Tramite homebrew).
Quinn Comendant

2

L' utilità autojump fornisce un meccanismo simile con un elenco di directory più utilizzato. Tuttavia, richiede il tedio aggiuntivo della digitazione, jSpacema questo è compensato indovinando giusto il più delle volte.

Questo è il più vicino a DWIM che ho usato fino ad oggi.


1

Una volta ho realizzato uno script utile per uno scopo simile, con una funzione fcd per find-n-cd.

Digiti fcd fooe possono accadere 3 cose:

  • Non viene trovata alcuna directory foo, quindi ritorna con "no such directory " $1
  • È stato trovato un file: verifica se si tratta di una directory (o solo di un file) e, in tal caso, può essere registrato lì.
  • Vengono trovati più file - quindi viene presentata una selezione, in cui si digita semplicemente il numero della selezione (o un numero speciale per la restituzione).

È simile in quanto non è necessario che tu digiti l'intero percorso, ma hai chiamato la funzione esplicitamente.

#!/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
}

Devi avere sourcela funzione ( source fcd.sh| . fcd.sh) e non puoi chiamarlo come script, perché cdaltrimenti accadrebbe solo nel contesto dello script, e dopo aver finito ti verrebbe di nuovo immediatamente nella directory di partenza.

Dal momento che funziona locate, è abbastanza veloce nel trovare directory (ma non sempre aggiornate).

Non gestisce gli spazi vuoti nei nomi di directory con garbo. Se hai una soluzione elegante per il problema, sarei felice.


1
La domanda era cdautomaticamente, senza digitare alcun comando. Questa risposta è più adatta per la navigazione rapida delle directory nel terminale .
arte

2
@manatwork: bene, puoi combinare il comando con il gestore degli errori di bash. Dentro /etc/bash.bashrcc'è, in Ubuntu, un function command_not_found_handleaspetto che potrebbe essere modificato.
utente sconosciuto

Ti ho preso. In questo modo sembra molto meglio.
arte

@manatwork: lo farei da solo, se mi piacerebbe usarlo da solo. Ma se voglio cambiare directory, mi piace usare un breve comando, ma se digito male qualcosa, raramente ho dimenticato di digitare 3 o 4 caratteri. Avere questo programma inserito sarebbe piuttosto fastidioso per me, ma usarlo esplicitamente va bene.
utente sconosciuto

1

Questo funziona anche,

cdf name_of_file_or_directory

..dato che hai impostato uno script cdf.sh personalizzato (sotto) proveniente dalla shell. Per una directory come parametro, questo script arriva solo alla directory padre per la directory trovata. Aggiungi la seguente riga nel tuo .bashrc o .zshrc, qualunque cosa ..

source ~/bin/cdf.sh 

E aggiungi questo codice nel file ~ / bin / cdf.sh che devi creare da 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}
}

Ottima risposta a una vecchia domanda. Credo che riceverai un badge per rianimare una vecchia domanda e benvenuti in U & L.SE
eyoung100,

0

Metti questo nel tuo ~/.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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.