Jak mogę przejść do poprzedniego katalogu zamiast iść w górę?

214

Obecnie spędzam wiele godzin pracy, przemieszczając się między dwiema ścieżkami, które są bardzo daleko w dół od drzewa i odwracają się od siebie u podstawy. Uderza mnie, że moje życie byłoby o wiele łatwiejsze, gdyby istniał argument przemawiający za cdprzejściem do ostatniego katalogu, w którym się znajdowali.

To znaczy, jeśli jestem w:

/etc/foo/bar/baz/moo

a następnie wpisz:

cd /var/lib/fubarred_app/blargh/logs

Chciałbym móc wrócić do pierwszego katalogu bez konieczności ponownego wpisywania całej ścieżki.

Klawisz pamięci go nie wycina, ponieważ używam wystarczającej liczby poleceń w każdym miejscu, że równie trudno jest wrócić i znaleźć ścieżkę, którą chcę, jak sam ją wpisać.

Czy istnieje krótkie polecenie, które pozwoliłoby mi przejść do poprzedniego katalogu?

Icchak
źródło
8
oprócz doskonałej odpowiedzi @ bryana , możesz rozważyć utworzenie pary aliasów dla każdej ścieżki, aby po prostu wpisać w wierszu polecenie : „ bazmoo” lub „ blarghlog” :)
warren
4
Dlaczego po prostu nie używasz ekranu GNU ?
Shi,
2
Która skorupa? to robi ogromną różnicę.
Randal Schwartz
@warren ditto. to mój ulubiony sposób na zrobienie wszystkiego. połowa tego, do czego używam mojego komputera, ma teraz swój własny alias ... =)
ixtmixilix
Fasd jest niesamowity. Sprawdź to.
majkinetor,

Odpowiedzi:

301

Komenda

cd -

wykona zamianę, której potrzebujesz na większości pocisków głównego nurtu, tym starszy jest dłuższy wariant

cd "$OLDPWD"

która użyje zmiennej środowiskowej, która zawiera poprzedni katalog roboczy.


Strona podręcznika POSIX dlacd wzmianek:

OPIS

Jeśli podczas wykonywania powyższych kroków zmienna środowiskowa PWD zostanie zmieniona, zmienna środowiskowa OLDPWD również zostanie zmieniona na wartość starego katalogu roboczego (to jest bieżącego katalogu roboczego bezpośrednio przed wywołaniem cd).

OPERACJE

  -   Gdy jako argument jest używany łącznik, jest to równoważne z poleceniem:

cd "$OLDPWD" && pwd 

który zmienia poprzedni katalog roboczy, a następnie zapisuje jego nazwę.

bryan
źródło
7
Należy pamiętać, że tak naprawdę zależy to od używanej powłoki, a ponieważ nie określono jej, ciężko byłoby udzielić nieistniejącej odpowiedzi „przenośnej”.
Randal Schwartz
16
@Randall, być może mógłbyś połączyć wszystkie swoje indywidualne komentarze dotyczące powłoki w jedną odpowiedź Voltron-Shell.
hyperslug
@Randall. Używałem bash. Działa również w ksh i zsh. Nawiasem mówiąc, po raz pierwszy nauczyłem się programować w wydaniu Learning Perl z 1994 roku, więc przepraszam, gdy trochę fanboy. :)
Yitzchak,
Hmm, użyłem cd $OLDPWDdo tego. Fajnie, że muszle głównego nurtu oferują znacznie krótszą formę.
ulidtko
2
@sinni Niektóre smaki zrobić mają pushd, a przynajmniej jest to wbudowane w bash.
slhck
105

Oprócz odpowiedzi Bryana, warto wspomnieć, że są też pushdi popd, które budują katalogi jak stos. Jest to również dostępne w systemie Windows NT; jednak nie jest dostępny we wszystkich powłokach.

Na przykład możemy przejść do trzech różnych katalogów i zawsze zobaczysz swój stos, gdy zadzwonisz pushd:

charon:~ werner$ pushd Documents/
~/Documents ~

charon:Documents werner$ pushd ../Movies/
~/Movies ~/Documents ~

charon:Movies werner$ pushd ../Downloads/
~/Downloads ~/Movies ~/Documents ~

A kiedy dzwonisz popdtrzy razy z rzędu, trafiasz do tych katalogów na stosie w odwrotnej kolejności. Jednocześnie stos zostanie ponownie opróżniony.

charon:Downloads werner$ popd
~/Movies ~/Documents ~

charon:Movies werner$ popd
~/Documents ~

charon:Documents werner$ popd
~

charon:~ werner$ popd
-bash: popd: directory stack empty

Jeśli używasz Zsh; ma opcję AUTO_PUSHD, która automatycznie pcha cdna stos.

slhck
źródło
pushd i popd nie są dostępne we wszystkich powłokach.
Randal Schwartz
5
@ Wiesław: Naprawdę? Chciałbym, żeby bash to miał ... Oczywiście, mógłbym nazywać cdsię alisem pushd, i to w większości byłoby takie samo.
Chris Charabaruk,
3
Lub pseudonim pd to pushd i mieć oba. BTW pushd (lub pd, jeśli jest alias) samo zamienia katalog bieżący i katalog ostatnio pchany, zasadniczo osiągając to, co robi „cd -”.
JRobert
Podoba mi się ta koncepcja, ale nigdy się do nich nie przyzwyczaiłem.
Thorbjørn Ravn Andersen
13

Istnieje kilka programów „skokowych”

  • autojump (utrzymywany za pomocą podstawowych funkcji)
  • j2 (najwyraźniej nieobsługiwany przez niektóre zaawansowane funkcje)
  • z (utrzymana wersja „j” z zaawansowanymi funkcjami)

Ułatwiają one wszelkiego rodzaju nawigację w katalogu. Używasz go, podając część ścieżki i to po prostu działa.

W Twoim przypadku

~$ j baz 
/etc/foo/bar/baz/moo$

~$ j bla 
/var/lib/fubarred_app/blargh/logs$

Możesz przypisać dowolną literę do tych programów, „j” to tradycja :)

j2 i z obsługują wiele wyszukiwanych terminów, ...

~$ j baz src
/home/me/projects/baz/repository/trunk/src$

... i więcej opcji.

~$ j -l  # list directories by "frecency"(frequency + recency) score
~$ j -r PATTERN # match by rank only, not recency
~$ j -t PATTERN # match by recency only, not rank
Hayalci
źródło
2
„j” jest wyraźnie specyficzne dla powłoki. Nie powiedziałeś tego.
Randal Schwartz
3
@Randal: Jak to jest specyficzne dla powłoki? To jest program.
Fixee
3
Jestem idiotą. :) Teraz to widzę.
Randal Schwartz
10

Oprócz cd -icd $OLDPWD

Możesz użyć wyszukiwania historii, naciskając CTRL-Ri wpisując kilka liter cdwcześniej wprowadzonego polecenia. CTRL-RKilkukrotne naciśnięcie spowoduje wyświetlenie starszych dopasowań.

Ta metoda będzie bardziej przydatna, jeśli masz więcej niż dwie ścieżki do zmiany.

musa
źródło
1
CTRL-R niekoniecznie pomoże. Być może byłeś w / some / obscure / directory / deep i zrobiłeś "cd evendeeperdir", a potem poszedłeś do ~ / somehere / different.
justintime
1
Wspaniały! Działa z innymi rzeczami niż cdświetna pomoc!
Niloct,
9

Możesz użyć tego do łatwego tworzenia aliasów dla katalogów:

a() { alias $1=cd\ $PWD; }

a 1

i później:

1
Pan Przykład
źródło
1
Tylko w powłoce, która rozumie aliasy i funkcje. Nie wszyscy tak.
Randal Schwartz
więc to pomija wpisywanie alias =części? hmmmm
Xen2050
6

bashmark pozwoli ci dodać do zakładek serię folderów i przeskakiwać między nimi z uzupełnieniem tabulacji:

Aby dodać zakładkę do folderu, po prostu przejdź do tego folderu, a następnie dodaj go do zakładek w następujący sposób:

bookmark foo

Zakładka zostanie nazwana „foo”. Jeśli chcesz wrócić do tego folderu, użyj:

go foo

Aby zobaczyć listę zakładek:

bookmarksshow

Uzupełnianie tabulatorów działa, aby przejść do zakładki shoobie, po prostu:

go sho[tab]
Złota rączka 5
źródło
4

Inną możliwością byłoby po prostu pozostawienie dwóch okien otwartych, z jednym ustawionym w każdym katalogu.

Alger
źródło
Nie ma wspólnej historii, jeśli regularnie używasz / edytujesz poprzednie polecenia (być może reset spowodowałby ich ...?)
Xen2050
@ Xen2050 Zobacz opcję powłoki share_historyw zsh.
Radon Rosborough
4

Wiem, że nie jest to ściśle odpowiedź na twoje pytanie, ale pomaga osiągnąć cel, jakim jest zabranie cię do ważnych katalogów .

w dowolnym systemie UNIX-bash możesz użyć CDPATH, aby rozszerzyć folder, w którym szuka polecenia cd.

z mojego pliku .bashrc:

export CDPATH='.:~/source/'

cd najpierw szuka w twoim bieżącym folderze, a potem w moim katalogu projektu-kodowania.

cd myproject

.. zabiera mnie do ~ / sources / myproject z miejsca, w którym aktualnie stoję.

Prosta mała funkcja, która bardzo pomogła w nawigacji w katalogu.

phareim
źródło
1
+1 Dodaje folder CDPATH do cdlisty autouzupełniania (TAB), co jest dobre. Ale jeśli .nie jest dołączony i jeśli w folderze CDPATH znajduje się folder o takiej samej nazwie jak w bieżącym katalogu, to cd samenameprzejdzie on do katalogu CDPATH, a nie do katalogu w bieżącym katalogu, który jest zły. Musisz użyć, cd ./samenameaby dostać się do folderu duplikatu.
Xen2050
Tak, dobry komentarz. Zawsze uwzględniaj pierwszy . lub doświadczysz dziwnych rzeczy.
phareim,
3

Tak, cd -jest to najlepsza droga, ale martwię się o brak mocy, którą masz w swojej skorupie. popdi pushdsą również dobre, i to jteż wygląda dobrze.

Wrzucę własne narzędzie do ringu ... to po prostu coś, co buduję, dostosowuję i migruję ze sobą przez ostatnie 10 lat i działa dobrze dla tego, co chcę.

Wpis na blogu dotyczący mojego narzędzia do zarządzania katalogami

Jeśli to zadziała, to świetnie, ale jeśli nie, to obiecaj, że dostaniesz coś innego :) Po prostu nie możesz żyć cdsam.

Derek Wyatt
źródło
3

Jeśli masz tylko 2 katalogi, najłatwiejszym sposobem jest, jak wspomniano,

cd -

Kiedy miałem takie rzeczy w przeszłości, miałem kilka sztuczek, które zrobiłem, które mogą być pomocne.

  1. Umieść polecenia aliasu w pliku .cshrc, coś takiego

    alias moo /etc/foo/bar/baz/moo  
    alias logs cd /var/lib/fubarred_app/blargh/logs
    
  2. Połącz skróty do interesujących ścieżek z mojego katalogu domowego. To jest jednorazowa sprawa.

    cd ~
    ln -s /var/lib/fubarred_app/blargh/logs blargh
    ln -s /etc/foo/bar/baz/moo
    

Umożliwiłoby to zmianę katalogu tak łatwo, jak:

   cd ~/moo
   cd ~/blargh
PearsonArtPhoto
źródło
2

Autojump to polecenie bash / sh / zsh "cd", które z twoich działań, zobacz ten film .

więc to przeniosło cię do muczenia, gdy pozna ostatnie foldery

j moo
oliwki
źródło
2

Belka

Mam własne narzędzie, ale przyjrzę się również narzędziu Dereks j.

Oczywiście pierwszym wyborem jest skakanie tam iz powrotem

Płyta CD -

Moje narzędzie jest przeznaczone do katalogów z unikalnymi nazwami w systemach, o ile locatesą dostępne; wyszukuje pasującą nazwę katalogu i przechodzi do pierwszego dopasowania:

beam () 
{ 
    ldir=$(locate $1 | egrep "$1$" | head -n 1);
    if [[ -d $ldir ]]; then
        echo $ldir;
        cd $ldir;
    else
        echo "no directory "$ldir;
    fi
}

Zależności:

  • Znajdź
  • grep
  • głowa

Wady:

  • nowsze katalogi niż ostatni zaktualizowany przebieg nie zostały znalezione
  • jeśli pasuje więcej niż jeden katalog, zależy to od szczęścia, czy zostaniesz przeniesiony do tego, o którym myślisz.

Ulepszenia / modyfikacje:

  • zamiast wybierać pierwszy katalog, kod można zmodyfikować w celu wyświetlenia listy opcji, zachęcając użytkownika do wprowadzenia 1,2,3, ... przejścia do / bin, / usr / bin, / usr / local / bin ...

Stosowanie:

  • umieść tę funkcję w pliku /etc/bash.bashrc lub ~ / .bashprofile, aby użyć jej w wygodny sposób.

Zaletą mojego rozwiązania:

  • nie ogranicza się do 2 katalogów, takich jak cd -
  • nie musisz raz odwiedzać katalogów, zanim użyjesz wiązki.
nieznany użytkownik
źródło