cd po prostu wpisując nazwę katalogu?


58

Miałem to gdzieś 20 lat temu lub marzyłem o tym.

Gruntownie:

Jeśli jeśli napiszę blobblobto
blobblob: command not found

Słusznie.

Chciałbym, aby gdy moja powłoka otrzymała te błędy - polecenie nie zostało znalezione - sprawdza, czy istnieje katalog o tej nazwie ('blobblob') i czy robi to cdz tym katalogiem.

Jestem pewien, że istnieją pewne powody, aby tego nie robić lub robić to ostrożnie.
Po prostu myślę, że byłoby całkiem fajnie i chciałbym spróbować, znajdując gdzieś (jak tutaj!).

Nie mam pojęcia, jak może to sugerować rodzaj programowania powłoki.

Odpowiedzi:


76
  • Grzmotnąć: shopt -s autocd
  • Zsh: setopt autocd
  • tcsh: set implicitcd

Również „autojump” jest przydatnym narzędziem. Po zainstalowaniu zapamiętuje katalogi, dzięki czemu możesz wpisać j abc, a jeśli wcześniej odwiedziłeś abc, powiedz x / d / f / g / t / abc, a następnie przeniesie się do niego!
https://github.com/joelthelion/autojump


1
Tak, napisałem shopt -s autocdw wierszu polecenia, w którym działało. Teraz mogę po prostu zacząć wpisywać nazwy katalogów i użyć autouzupełniania, a następnie wcisnąć return i powłokę cddo katalogu. Ale fajnie !
Michael Durrant

6
Wspaniały. Dziękujemy za wskazanie nieprawidłowości, których należy unikać.
vonbrand,

3
Nie używam tego - cdnie jest tak trudne do pisania, a większość mechanizmów uzupełniania tabulatorów jest mądrzejszych, gdy dajesz im większy kontekst.
jw013

Po przesunięciu w tył nadmiernego okrzyku uznania, powiem tylko, że autocd jest rzeczywiście właściwą odpowiedzią: D
Luc

autocdShopt dodano w bash wersji 4. Nie jest więc dostępny na MacOS (który nadal ma wersji bash 3.xx), chyba że zastępcy, nowsze bash został zainstalowany (na przykład poprzez homebrew).
Quinn Comendant

2

Narzędzie autojump zapewnia podobny mechanizm z listą katalogów najczęściej używanych. Wymaga to jednak dodawania nudy pisania, jSpaceale kompensuje to częste zgadywanie.

To jest najbliżej DWIM , którego do tej pory używałem.


1

Kiedyś stworzyłem przydatny skrypt do podobnego celu, z funkcją fcd dla find-n-cd.

Wpisujesz fcd fooi 3 rzeczy mogą się zdarzyć:

  • Nie znaleziono takiego katalogu foo, a następnie zwraca za pomocą "no such directory " $1
  • Znaleziono jeden plik: sprawdza, czy jest to katalog (czy tylko plik), a jeśli tak, to tam jest CD.
  • Znaleziono wiele plików - następnie prezentowany jest wybór, w którym wystarczy wpisać numer wyboru (lub specjalny numer do zwrotu).

Podobnie jest w tym, że nie trzeba wpisywać całej ścieżki, ale funkcja została wywołana jawnie.

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

Musisz użyć sourcefunkcji ( source fcd.sh| . fcd.sh) i nie możesz wywoływać jej jako skryptu, ponieważ w cdinnym przypadku miałoby to miejsce tylko w kontekście skryptu, a po zakończeniu natychmiast wracałbyś do początkowego katalogu.

Ponieważ działa locate, dość szybko znajduje katalogi (ale nie zawsze aktualne).

Z wdziękiem nie obsługuje pustych nazw katalogów. Jeśli masz eleganckie rozwiązanie problemu, byłbym szczęśliwy.


1
Pytanie brzmiało cdautomatycznie, bez wpisywania żadnego polecenia. Ta odpowiedź jest bardziej odpowiednia do szybkiej nawigacji w katalogu w terminalu .
manatwork

2
@manatwork: Cóż, możesz połączyć polecenie z programem obsługi błędów bash. W /etc/bash.bashrcUbuntu znajduje się taki, function command_not_found_handlektóry wygląda, jakby można go zmodyfikować.
użytkownik nieznany

Mam cię. W ten sposób brzmi znacznie lepiej.
manatwork

@manatwork: Zrobiłbym to sam, gdybym sam tego chciał. Ale jeśli chcę zmienić katalog, lubię używać krótkiego polecenia, ale jeśli coś pomylę, rzadko zapominam wpisać 3 lub 4 znaki. Posiadanie tego programu byłoby raczej denerwujące, ale użycie go jawnie jest w porządku.
użytkownik nieznany

1

To też działa,

cdf name_of_file_or_directory

.. biorąc pod uwagę, że skonfigurowałeś niestandardowy skrypt cdf.sh (poniżej) pochodzący z powłoki. W przypadku katalogu jako parametru ten skrypt dostaje się tylko do katalogu nadrzędnego dla znalezionego katalogu. Dodaj następujący wiersz do .bashrc lub .zshrc, cokolwiek ..

source ~/bin/cdf.sh 

I dodaj ten kod do pliku ~ / bin / cdf.sh, który musisz utworzyć od zera.

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

Świetna odpowiedź na stare pytanie. Wierzę, że otrzymasz odznakę za przywrócenie starego pytania. Witamy w U & L.SE
eyoung100

0

Umieść to w swoim ~/.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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.