CD durch Eingabe des Verzeichnisnamens?

58

Entweder hatte ich das vor 20 Jahren oder ich habe davon geträumt.

Grundsätzlich gilt:

Wenn wenn Typ blobblobich bekomme
blobblob: command not found

Fair genug.

Ich möchte, dass meine Shell, wenn sie diese Fehler erhält - Befehl nicht gefunden - prüft, ob ein Verzeichnis mit diesem Namen existiert ('blobblob') und ob es sich cdum dieses Verzeichnis handelt.

Ich bin mir sicher, dass es einige Gründe gibt, dies nicht oder mit Vorsicht zu tun.
Ich denke nur, dass es ziemlich ordentlich wäre und ich würde es gerne versuchen, indem ich finde, wie irgendwo (wie hier!).

Ich habe keine Ahnung, wie man die Art von Shell-Programmierung macht, die dies implizieren könnte.

Michael Durrant
quelle

Antworten:

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

Auch 'Autojump' ist ein nützliches Werkzeug. Nach der Installation werden die Verzeichnisse gespeichert, sodass Sie j abc eingeben können. Wenn Sie bereits abc besucht haben, sagen Sie x / d / f / g / t / abc, dann wird die CD dorthin verschoben!
https://github.com/joelthelion/autojump

jw013
quelle
1
Ja, ich habe shopt -s autocdan der Kommandozeile getippt, als es funktionierte. Jetzt kann ich einfach mit der Eingabe von Verzeichnisnamen beginnen und die automatische Vervollständigung verwenden. Dann drücke ich die Eingabetaste und die Shell cdin das Verzeichnis. So cool !
Michael Durrant
6
Toll. Vielen Dank, dass Sie auf ein zu vermeidendes Fehlverhalten hingewiesen haben.
Vonbrand
3
Ich verwende das nicht - es cdist nicht so schwer zu tippen, und die meisten Mechanismen zum Vervollständigen von Registerkarten sind intelligenter, wenn Sie ihnen mehr Kontext geben.
JW013
Lassen Sie mich nach einem übermäßigen Ausruf der Wertschätzung nur sagen, dass autocd in der Tat die richtige Antwort ist: D
Luc
Das autocdshopt wurde in der Bash-Version 4 hinzugefügt. Daher ist es unter macOS (das noch die Bash-Version 3.xx hat) nur verfügbar, wenn eine alternative, neuere Bash installiert ist (z. B. über Homebrew).
Quinn Comendant
2

Das Dienstprogramm zum automatischen Überspringen bietet einen ähnlichen Mechanismus mit einer Liste der am häufigsten verwendeten Verzeichnisse. Es erfordert jedoch die zusätzliche Mühe des Tippens, jSpaceaber dies wird durch häufiges Erraten des richtigen Wertes ausgeglichen.

Dies ist das DWIM am nächsten, das ich bisher verwendet habe.

msw
quelle
1

Ich habe einmal ein nützliches Skript für einen ähnlichen Zweck erstellt, mit einer Funktion fcd für find-n-cd.

Sie tippen fcd foound 3 Dinge können passieren:

  • Kein solches Verzeichnis foo gefunden, dann kehrt es mit zurück "no such directory " $1
  • Eine Datei wurde gefunden: Es wird geprüft, ob es sich um ein Verzeichnis (oder nur um eine Datei) handelt, und wenn ja, wird es dort gespeichert.
  • Es werden mehrere Dateien gefunden - dann wird eine Auswahl angezeigt, bei der Sie nur die Nummer der Auswahl (oder eine spezielle Nummer für die Rückgabe) eingeben.

Es ist insofern ähnlich, als Sie nicht den gesamten Pfad eingeben müssen, sondern die Funktion explizit aufrufen müssen.

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

Sie müssen sourcedie Funktion ( source fcd.sh| . fcd.sh) ausführen und können sie nicht als Skript aufrufen, da cddies sonst nur im Kontext des Skripts geschehen würde und Sie nach Abschluss sofort wieder in Ihrem Startverzeichnis wären.

Da es mit funktioniert locate, ist es ziemlich schnell beim Auffinden von Verzeichnissen (aber nicht immer auf dem neuesten Stand).

Leerzeichen in Verzeichnisnamen werden nicht ordnungsgemäß verarbeitet. Wenn Sie eine elegante Lösung für das Problem haben, würde ich mich freuen.

Benutzer unbekannt
quelle
1
Die Frage war zu cdautomatisch, ohne einen Befehl einzugeben. Diese Antwort eignet sich besser für die Schnellnavigation im Terminal .
Handarbeit
2
@manatwork: Nun, Sie können den Befehl mit dem Fehlerbehandler von bash kombinieren. In /etc/bash.bashrcUbuntu gibt es einen, function command_not_found_handleder so aussieht, als könnte er geändert werden.
Benutzer unbekannt
Hab dich. Dieser Weg klingt viel besser.
Manatwork
@manatwork: Ich würde es selbst machen, wenn ich es selbst benutzen möchte. Aber wenn ich das Verzeichnis wechseln möchte, verwende ich gerne einen kurzen Befehl, aber wenn ich etwas falsch eingebe, vergesse ich selten, 3 oder 4 Zeichen einzugeben. Es wäre ziemlich ärgerlich für mich, wenn ich dieses Programm einsetze, aber es explizit zu verwenden ist in Ordnung.
Benutzer unbekannt
1

Das funktioniert auch,

cdf name_of_file_or_directory

..gegeben, dass Sie ein benutzerdefiniertes cdf.sh-Skript (unten) in der Shell eingerichtet haben. Bei einem Verzeichnis als Parameter gelangt dieses Skript nur zum übergeordneten Verzeichnis für das gefundene Verzeichnis. Fügen Sie die folgende Zeile in Ihre .bashrc- oder .zshrc-Datei ein.

source ~/bin/cdf.sh 

Fügen Sie diesen Code in die Datei ~ / bin / cdf.sh ein, die Sie neu erstellen müssen.

#!/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
quelle
Tolle Antwort auf eine alte Frage. Ich glaube, Sie erhalten ein Abzeichen für die Wiederbelebung einer alten Frage, und Willkommen bei U & L.SE
eyoung100
0

Gib das in dein ~/.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
quelle