Verwenden Sie cd, um mehrere Verzeichnisebenen aufzurufen

39

Ich habe es mit Java-Projekten zu tun, die häufig zu tief verschachtelten Ordnern führen (/ path / to / project / com / java / lang / whatever usw.) und manchmal in der Lage sein möchten, beispielsweise 4 Verzeichnisebenen nach oben zu springen. Die Eingabe von cd ../../../ .. ist ein Schmerz, und ich möchte keinen Symlink erstellen. Gibt es ein Flag für cd, mit dem Sie mehrere Verzeichnisebenen hochgehen können (in meinem Kopf wäre es so etwas wie cd -u 4)? Leider kann ich keine Manpage für CD finden, sondern nur die nutzlose "builtins" -Seite.

Tossrock
quelle
1
Bash ändern, um zu interpretieren, cd ...wo die Nummer von '.' wäre die Anzahl der Ebenen zu steigen. Würde dies einen Konflikt verursachen, den ich nicht kenne?
Für diejenigen, die für MacOS hierher kommen, können Sie installieren zshund Oh My Zshdas ist eine bessere Alternative zu bashund dann können Sie einfach cd ...(mehrere Punkte) tun, wie es sein sollte
Dominic

Antworten:

29

Oder ... versuchen Sie Folgendes: (yay Google)

Navigieren Sie mit ..n durch das Verzeichnis:

Im folgenden Beispiel wird ..4 verwendet, um die Verzeichnisebene um 4 zu erhöhen, ..3, um die Verzeichnisebene um 3 zu erhöhen, ..2, um die Verzeichnisebene um 2 zu erhöhen.

Fügen Sie dem .bash_profile den folgenden Alias ​​hinzu und melden Sie sich erneut an.

alias .. = "cd .."

alias ..2 = "cd ../ .."

alias ..3 = "cd ../../ .."

(etc)

Siehe Hack # 2

cutrightjm
quelle
10
Ich würde eher die Aliase verwenden .., ...und ....da sie schneller zu geben, aber das Prinzip der Aliase ist das gleiche natürlich.
Bernhard
1
@bernhard Gern geschehen, da ich nicht glaube, dass dies zu Konflikten führen würde. Ich habe es so belassen, wie es ist, weil ich es von der Website zitiert habe.
Cutrightjm
Die 4DOS.EXE Shell für DOS unterstützt cd ..., cd ....etc. Es war sehr praktisch.
Alexios
..... ist nicht schneller als ..4, in der Tat ist es 2 Zeichen langsamer ..
Ryan
29

Eine einfache Funktion, auch mit einem Alias:

function cd_up() {
  cd $(printf "%0.s../" $(seq 1 $1 ));
}
alias 'cd..'='cd_up'

(Sie können dies in definieren, ~/.bashrcwenn Sie es in jedem Fall möchten).

Es ist einfach zu bedienen:

$ cd.. 10
Grigory K
quelle
Schön! Funktioniert bei mir! Bash 4.3.11
Carlos Nunez
2
Gute Antwort; Vielleicht möchten Sie darauf hinweisen, dass dies besser ist als Lösungen wie eval $(printf "cd ..;%.s" $(seq $1))die cdmehrfach, da ~-aka $OLDPWDauf das Arbeitsverzeichnis vor dem Aufruf und nicht auf ein Zwischenverzeichnis festgelegt ist. PS - es vereinfacht sich, cd $(printf %.s../ $(seq "$1"))wenn Sie wollen.
Toby Speight
10

Eine einfache Low-Tech-Lösung, die kein Setup benötigt. Funktioniert jedoch nur in Shells mit bash-style-Befehlsbearbeitung.

  • Art cd ..
  • Drücken Sie Up-arrow Returnso oft wie nötig. Sehr schnell, wenn Sie zwei Finger benutzen.
Tom Zych
quelle
2
haha, keine schlechte Antwort, denke ich :)
Joshmcode
8

Es stellt sich heraus, dass die richtige Antwort 'cd + n' lautet, wobei n die Anzahl der Stufen ist, die Sie erreichen möchten. Schade, dass das nirgendwo dokumentiert ist!

Tossrock
quelle
17
Zumindest funktioniert es NICHT in Bash.
HongboZhu
5
Funktioniert nicht mit Bash 4.2.25, wie mit Debian ausgeliefert. Was * nix und / oder Shell benutzt du aus Neugier?
Alexios
Bash hat einen eingebauten Aufruf dirs, der [+ n] als Argument verwendet und das n-te eindeutige Verzeichnis ausgibt, das über hinzugefügt wurde pushd. Wenn Sie alias cdauf pushd, dann können Sie diese verwenden. Beachten Sie jedoch, dass dies technisch gesehen keine Antwort auf die Frage des OP ist, da dies mit eindeutigen Verzeichnissen zu tun hat, was bedeutet, dass die Reihenfolge mit der Zeit durcheinander gerät, wenn Sie zu denselben Verzeichnissen zurückkehren.
Brian Peterson
Ja, pushdund popdnimm auch eine [+ n] Option, weshalb das funktionieren kann. Auch wenn es unvollkommen und indirekt ist, kann dies als Antwort auf die Frage verwendet werden. Häufig haben Sie in letzter Zeit die Verzeichnisse über Ihnen besucht, sodass sie sich in den letzten 10 vom Verzeichnisstapel gespeicherten Verzeichnissen befinden.
Brian Peterson
hat bei mir nicht funktioniert ...
Vass
4

Sie könnten eine Funktion schreiben (es muss eine Funktion sein, da Sie den Status Ihrer Shell selbst ändern möchten, nämlich das Arbeitsverzeichnis; ein externer Befehl würde nur ihren eigenen Prozess beeinflussen).

Hier ist eine Funktion , die eine Anzahl von Ebenen als Argument (default 1) in der übergebenen steigen wird physische Verzeichnisstruktur (so, wie cd -P .., n - mal):

up() {
    # default parameter to 1 if non provided
    declare -i d=${@:-1}
    # ensure given parameter is non-negative. Print error and return if it is
    (( $d < 0 )) && (>&2 echo "up: Error: negative value provided") && return 1;
    # remove last d directories from pwd, append "/" in case result is empty
    cd "$(pwd | sed -E 's;(/[^/]*){0,'$d'}$;;')/";
}

Benutze es so:

up 4
mgild
quelle
1
Während dieser Code möglicherweise die Frage beantwortet, verbessert das Bereitstellen eines zusätzlichen Kontexts, warum und / oder wie dieser Code die Frage beantwortet, seinen langfristigen Wert.
Donald Duck
1
Einverstanden, ich habe ein paar Kommentare hinzugefügt, um zu helfen.
mgild
Nitpicky zu sein, ist nicht up 4gleichbedeutend mit der cd /some/dir/Annahme $PWD = "/some/dir/that/is/deeply/nested/"?
Snapfractalpop
2

Nicht genau das, wonach du fragst, aber du solltest nachsehen pushdund popd. Ich finde sie für die Ordnernavigation viel nützlicher als einige cd...Aliasnamen

Wenn Sie von ein paar festgelegten Bereichen aus hin und her gehen, ist es üblich, Aliase zu haben.

alias proj1='cd /some/dir/containing/proj1'
alias proj2='cd /some/deeper/dir/structure/containing/proj2'
Reiche Homolka
quelle
1

Anstelle von Aliasen können Sie auch die folgende Bash-Funktion verwenden:

function mcd() {
  up=""

  for ((i=1; i<=$1;i++)); do
    up="${up}../"
  done

  cd $up
}

(oder als eint liner: function mcd() { up=""; for ((i=1; i<=$1;i++)); do up="${up}../"; done; cd $up; })

Wenn Sie dies zu Ihrer ~/.bashrcDatei hinzufügen, wird es in Ihrem Terminal verfügbar. Wenn Sie ../../../../../../vor dem Aufruf einen String erstellen, können Sie cdauch cd -zum Startverzeichnis zurückkehren.

Eine hilfreichere Implementierung könnte auch einige Benutzereingabeprüfungen enthalten:

function mcd() {
    if [[ $1 -lt 1 ]]; then
        echo "Only positive integer values larger than 1 are allowed!" >&2
        echo -e "\n\tUsage:\n\t======\n\n\t\t# to go up 10 levels in your directory\n\t\tmcd 10\n\n\t\t# to go up just 2 levels\n\t\tmcd 2\n" >&2
        return 1;
    fi  

    up=""

    for ((i=1; i<=$1;i++)); do
        up="${up}../"
    done

    cd $up
}
Wen interessiert das
quelle
0

Kennen Sie sich mit Autojump aus ? Es ist ein Hack von Drittanbietern, kann aber in Ihrem Szenario nützlich sein.

AnonymousLurker
quelle
0

Probieren Sie den selten verwendeten Umgebungsparameter aus CDPATH. Dann müssen Sie den Pegel möglicherweise nicht explizit einstellen.

Beispiel:

$ find workspace -type d
workspace
workspace/project1
workspace/project1/com
workspace/project1/com/java
workspace/project1/com/java/lang

$ CDPATH=".:~/workspace:~/workspace/project1:~/workspace/project1/com:~/workspace/project1/com/java:~/workspace/project1/com/java/lang"
$ cd com
$ pwd
~/workspace/project1/com

Wenn Sie an mehreren Projekten arbeiten, können Sie die CDPATH-Einstellung in eine projektspezifische Umgebungsdatei umwandeln. Und lösen Sie es mit einer Unterlegscheibe für zusätzliche Automatisierung aus.

Ich benutze oft pushd und popd. Ich verwende CDPATH eher, um mich zwischen Projektbäumen hin- und herhüpfen zu lassen, als in einem Projekt Subdir zu lassen - aber im Moment arbeite ich an vielen kleinen Projekten, nicht an einigen großen Projekten. :)

JezC
quelle
0

Wenn Sie sich zuvor im Zielverzeichnis befunden haben:

luna:/tmp % mkdir -p a/b/c/d
luna:/tmp % pwd
/tmp
luna:/tmp % cd a/b/c/d
luna:d % pwd
/tmp/a/b/c/d
luna:d % cd -
luna:/tmp % pwd
/tmp
luna:/tmp % 
Mama
quelle
0

Schauen Sie sich DirB an . Es ist ein BASH-Skript, mit dem Sie Lesezeichen wie folgt erstellen können:

BETRIEB

  • s Speichern Sie ein Verzeichnis-Lesezeichen
  • g Gehen Sie zu einem Lesezeichen oder einem benannten Verzeichnis
  • p Schieben Sie ein Lesezeichen / Verzeichnis auf den Verzeichnisstapel
  • r Gespeichertes Lesezeichen entfernen
  • d Mit Lesezeichen versehenen Verzeichnispfad anzeigen
  • sl druckt die Liste der Verzeichnislesezeichen

Sehr einfach, sehr effektiv.

rseal
quelle
0

Einen Schritt weiter von @ Grigorys Antwort entfernt:

function cd_up() {
if [ -z "$1" ]; then
    cd ..
else
    cd $(printf "%0.s../" $(seq 1 $1 ))
fi
}
alias 'cdd'='cd_up'

Das ist :

// go up 1 directory level 
$cdd

// go up 3 directory level 
$cdd 3
qun
quelle
0

Ich hatte genau dasselbe Problem satt und habe daraufhin CD-Plus geschrieben . Ein einzelnes Datei-CLI-Dienstprogramm, mit dem Sie mehrere Verzeichnisse aufzeichnen können.

Verwendung

echo `pwd` # /foo/bar/foobar/baz/foobaz/bazfoo
d baz

echo `pwd` # /foo/bar/
Kevin S Lin
quelle
0

Hinzufügen der folgenden Code zu Ihrem .bashrcwird erweitern cd‚s Abschluss zu Ehren drei Pluspunktnotation

_cd_dot_expansion() {
    local path="${COMP_WORDS[COMP_CWORD]}"

    if [[ "${path}" =~ ^\.{3,} ]]; then
        local dots="${BASH_REMATCH}"
        local levels="${#dots}"
        local tail="${path##*...}"
        local expanded_dots='..'

        # the loop starts at two because the first set of dots is
        # assigned to `expanded_dots` when it is initialized
        for (( i = 2; i < "${levels}"; i++ )); do
            expanded_dots+='/..'
        done

        path="${expanded_dots}${tail}"
        COMPREPLY=( $( compgen -A file "${path}" ) )

        return
    fi

    _cd
}

complete -o nospace -F _cd_dot_expansion cd

Sobald dieses Snippet in Ihrer Bash-Shell ausgeführt wird, vervollständigen Sie durch Tippen cd .../und Schlagen <TAB>den Pfad zu ../../und listen die relativen Pfade aller Verzeichnisse auf, die z. B. zwei Ebenen höher sind.

Update : bash-completionmuss installiert sein, um auf die _cdim obigen Code angegebene Methode zugreifen zu können . Es kann über die meisten Kommandozeilen-Paketmanager installiert werden

Grant Humphries
quelle