Gibt es einen Befehl, mit dem Sie in einem Verzeichnis mehrere Schritte zurückgehen können, ohne cd zu verwenden?

14

Ich gehe ständig 'cd ../../../../'. Gibt es einen Befehl / Alias, der mich 'cmd 4' gehen lassen könnte und ich würde 4 Verzeichnisse zurückerhalten?

Studiohack
quelle
ls? Sicher meinst du cd?
Chris Jester-Young
Ja, ich habe es gerade in Eile geschrieben;) Jetzt editieren.
Ist dies der Fall ?:alias cmd5 = "cd ../../../../../"
ypercubeᵀᴹ
Nun, ich schätze, ich könnte sie für 1 bis 10 oder so aufschreiben, aber es wäre schön, eine clevere Art zu haben, das zu tun. Das passt nicht wirklich zu mir. Wird das tun, wenn keine andere Lösung auftaucht.

Antworten:

16

Fügen Sie dies in Ihre ~/.bashrc:

cdup() {
  levels=${1-1}
  while ((levels--)); do
    cd ..
  done
}

(Der Name cdupstammt vom entsprechenden FTP-Befehl, nur zu Ihrer Information.)

Chris Jester-Young
quelle
Vielen Dank für die Antwort, ich stimme mit der Antwort von jleedev überein, da sie 1 Zeile kürzer ist und ich mich nicht entscheiden kann, wen ich wählen soll! Danke trotzdem!
@Muu: Beide Antworten werden funktionieren, aber meine werden für viele, viele Ebenen funktionieren, und @jleedevs wird nur für eine kleine Handvoll funktionieren (unabhängig von der Stapelbegrenzung). ;-) (Ich bin mir sicher, dass du niemals an die Grenzen stoßen wirst, aber meine ist allgemeiner, als ich es versuche. :-))
Chris Jester-Young
Guter Punkt, ich habe dir dann die Antwort gegeben. Sorry jleedev - obwohl ich höchstwahrscheinlich weiterhin deine Lösung verwende, da ich vergessen werde, sie zu ändern :)
11

Mir wurde beigebracht, unter solchen Umständen 'pushd' und 'popd' zu verwenden.

Geben Sie beispielsweise "pushd" ein. und dann 'cd / home'. Geben Sie nun 'popd' ein und Sie sind wieder an der Stelle, an der Sie begonnen haben.

'pushd' / 'popd' ist ein Stack. Sie können so viele Verzeichnisse verschieben, wie Sie möchten. Es ist jedoch immer das letzte Mal aktiv, wenn Sie popd ausführen.

ʍǝɥʇɐɯ
quelle
Hm, nett. Davon nichts gehört. Passt nicht ganz, wonach ich gesucht habe, wird aber auch verwendet. Vielen Dank.
10

Sicher warum nicht:

up () {
    [$ # = 0] && cd .. && return
    [$ 1 = 0] && return
    cd .. && up $ (($ 1 - 1))
}
Josh Lee
quelle
Bash ist nicht rekursiv, oder? Sie könnten einen Überlauf stapeln, wenn Sie dies tun up 500. :-)
Chris Jester-Young
6
Wenn Ihre Verzeichnisse so tief verschachtelt sind, haben Sie mein Mitgefühl.
Josh Lee
Benutzt das. Schlage Chris um eine Zeile;)
@ Muu: Ich wusste nicht, dass diese Frage ein Code Golf war! ;-) Übrigens, komm mit! codegolf.stackexchange.com
Chris Jester-Young
3
@Muu Bitte denken Sie daran, dass Rekursion im Allgemeinen nicht die richtige Methode zum Schreiben von Shell-Skripten ist.
Josh Lee
4

Schnell und dreckig:

cmd () { dir=.; for i in $(seq 1 $1); do dir=$dir/..; done; pushd $dir; }

Formuliert, um das Verzeichnis nur einmal zu ändern.

Glenn Jackman
quelle
2

Hier ist eine alternative Möglichkeit:

function cdup
{
    cd $(for ((i=0 ; i<$1 ;i++)); do printf "../" ; done)
}
jlliagre
quelle
1

Möglicherweise möchten Sie die Verwendung pushdund popddas Setzen von Ortsmarkierungen untersuchen und von jedem Verzeichnis, in das Sie gewechselt haben, problemlos dorthin zurückkehren.

Sie können auch eine Variable mit dem Namen eines Verzeichnisses festlegen, das Sie häufig verwenden, und dort CD:

MYPROJ=~/projects/name/src
cd $MYPROJ
proj1='cd $MYPROJ'
Caleb
quelle
1

Erstellen Sie den Pfad mit printfthen cdto it:

cdup() {
    local path
    printf -v path '%*s' "${1:-1}"
    cd "${path// /../}"
}

Benutzen als:

cdup 4 # to go up four directories
cdup 1 # to explicitly go up one directory
cdup   # to implicitly go up one
Bischof
quelle
0

Zwei Gedanken, die für Sie nützlich sein könnten:

  1. cd -
    wechsle zurück in das letzte Verzeichnis, in dem du warst. Ich benutze dies die ganze Zeit, um tief in meinem Codebaum zum Wurzelverzeichnis zurückzukehren ... obwohl das nur funktioniert, wenn du es in einem einzigen Verzeichnis abgelegt hast Veränderung.

  2. cdd old new
    Dies war eine Skriptfunktion, die ich in der Vergangenheit geschrieben hatte, um mich zwischen ähnlichen Bäumen zu bewegen. Grundsätzlich hat es zwei Argumente und einen regulären Ausdruck auf Ihrem Weg, ideal für die Bewegung zwischen Zweigen und so weiter. Wenn Sie beispielsweise in ~ / bzr / web / trunk / pfad / zu / feature wären und nach ~ / bzr / web / feature-branch / pfad / zu / feature gelangen müssten, würden Sie dies tun cdd trunk feature-branch. Die Implementierung, die ich hatte, war in einer archaischen Shell-Sprache unter AIX, aber sie war ziemlich trivial, sollte also einfach in der Shell der Wahl zu implementieren sein, wenn Sie sie benötigen. Für uns war es sehr nützlich, weil die Struktur so aussah: ... / {product} / {version} / {release} / {src, bld, dbg, pkg, tst} / {component} / ... so bewegend in diesem Baum wurde ziemlich schnell verrückt.

Taxifahrer
quelle