Jak szybko przenosić się z głęboko zagnieżdżonych katalogów do CLI?

16

Wiemy, że użycie cd <directory>spowoduje otwarcie katalogu, jeśli istnieje!

Ponadto cd ..zabierze nas o jeden poziom wyżej niż bieżący katalog roboczy.

Ale kiedy mamy zagnieżdżony /home/thina/teams/td/tech/app/release/apkskatalog o dłuższej ścieżce , męczące jest po prostu wchodzenie do folderu, apksa także trudno jest wrócić do innego węzła, powiedz tutaj /home/thina/teams.

Czy jest jakiś sposób na pominięcie wpisywania cdi cd ..? Używam Ubuntu 16.04.

gsthina
źródło
Tak! Czy jest jakiś sposób na pominięcie wpisywania cdi cd ..?
gsthina
@GSURENDARTHINA Wydaje mi się, że wiesz, że możesz zaoszczędzić co najmniej kilka naciśnięć klawiszy, cofając wiele poziomów jednocześnie, np. W twoim przypadkucd ../../../../..
underscore_d
2
Czy dowiązania symboliczne są opcją?
Kieszenie
1
Możesz także przyjrzeć się CDPATHzmiennej w bashdokumentach.
chepner
Na wypadek, gdybyś nie zdawał sobie sprawy: możesz zrobić „cd <katalog>” dla dowolnego katalogu w bieżącym katalogu roboczym - po prostu nie zaczynaj od ukośnika. Na przykład, jeśli katalog roboczy to obecnie „/ home / thina / team / td / tech / app / release”, wystarczy wpisać „cd
apks

Odpowiedzi:

30

Istnieje pushdi popd:

pushd /home/thina/teams/td/tech/app/release/apks
# current directory now /home/thina/teams/td/tech/app/release/apks
popd
# current directory now what it was before pushd command

Spróbuj help pushdi help popdwięcej opcji. Nie ma manstrony, ponieważ pushdi popdsą wbudowanymi poleceniami bash.

Jos
źródło
5
Czy nie cd -zrobiłby tego samego?
edwinksl
5
@edwinksl tak, ale pushdi popdpamiętam więcej niż jedną poprzednią ścieżkę.
Jos
8
Nie zapomnij dirspodać stosu katalogów w poleceniach pushd/ popd.
Arroniczny
4
Są one omówione na stronie podręcznika dla wbudowanych bashów (7), ponieważ są to wbudowane polecenia bash. (Lub można je również znaleźć na pełnej stronie podręcznika bash ). Są to te same informacje, co help pushdi help popdwspomniane przez ciebie (jak również help dirs), ale pomyślałem, że wspomnę o tym, na wypadek, gdyby ludzie zastanawiali się, skąd pochodzą te polecenia.
MT
2
@Jos źle pisałeśhelp pusdh
Sergiy Kolodyazhnyy
16

Oprócz bardzo dobrych już udzielonych odpowiedzi, oto kilka wskazówek na temat cdskutecznego korzystania .

  • cd - zabierze Cię z powrotem do ostatniego katalogu, w którym byłeś.
  • cd ../../..zabierze Cię na 3 poziomy naraz, możesz użyć ..notacji połączonej razem, aby „przejść w górę” tyle katalogów, ile chcesz.
  • Jeśli nie masz pewności, ile razy chcesz przejść w górę, użyj cd .., a następnie użyj historii bash, naciskając klawisz strzałki w górę, aby ponownie użyć polecenia.
  • Użyj, ~aby zastąpić bieżący katalog domowy użytkowników, jeśli jesteś zalogowany jako użytkownik thina, cd ~/teamszabierze Cię do/home/thina/teams
  • Użyj automatycznego uzupełniania Bash dla ścieżek, klawisz tabulacji uzupełni sekcję ścieżki w cdpoleceniu, jeśli wpiszesz część segmentu ścieżki, a następnie Tabsegment ten zostanie zakończony, jeśli nie będzie innego prawidłowego wyboru. Na przykład, jeśli wpiszesz, cd /home/thina/teams/td/ta następnie naciśniesz Tab, słowo tech zostanie dla Ciebie wypełnione, o ile w katalogu td, który zaczyna się na literę t, nie będzie żadnych innych plików ani katalogów.

Korzystanie z tych wskazówek razem może sprawić, że przechodzenie przez katalogi będzie cdznacznie mniej bolesne.

Arroniczny
źródło
2
Dodanie do rzeczy ~, szczególnie jeśli jesteś rootem, ~userszybko przeniesie Cię do userkatalogu domowego.
CVn
Dzięki, nie zdawałem sobie z tego sprawy, dodam to w następnej edycji.
Arronical
9

Aby wejść na drzewo o kilka poziomów naraz, możesz użyć następującej funkcji (dzięki muru dla ulepszonej wersji):

up ()
{
    local old="$PWD"
    for i in $(seq "${1:-1}"); do
        cd ..
    done
    OLDPWD="$old"
}

Następnie możesz zrobić:

$ pwd
/home/thina/teams/td/tech/app/release/apks
$ up 5
cd'ing into /home/thina/teams

Do tego:

  • wywołanie upbez argumentu jest równoznaczne cd ..z tym, ${1:-1}które zastępuje, $1gdy jest ustawione i w 1inny sposób
  • ustawienie OLDPWD po ostatnim cd ..ma na celu zachowanie zwykłego cd -zachowania.
parras
źródło
1
Technicznie jest to funkcja, a nie alias.
Reinier Post
@ReinierPost: Racja! Odpowiednio poprawiłem.
parras
2
Sugestie: -gtzamiast >. >jest leksykograficzny, porównuje się jako ciągi znaków. Ponadto, zamiast budować ścieżkę, dlaczego nie zrobić cd ..w pętli: for i in $(seq "${1:-1}"); cd ..; done? To także może wyeliminować ten ifwarunek.
muru
@muru Zgadzam się z twoją gtuwagą, ale odnośnie twojej drugiej sugestii zobacz ostatni punkt w odpowiedzi. Dla mnie to ma sens.
Oliphaunt - przywróć Monikę
1
@Oliphaunt, które nie jest szczególnie trudne, po prostu ustawiłeś OLDPWDoryginalną ścieżkę. Oto pełna wersja: paste.ubuntu.com/17990874
muru
7

W przypadku długich nazw katalogów użyj zmiennych z pełną ścieżką. Na przykład,

APKS="/home/thina/teams/td/tech/app/release/apks"

Więc możesz to zrobić cd "$APKS"

Jeśli chodzi o zwiększenie x liczby katalogów, mam tę funkcję zdefiniowaną w moim .bashrc

goup() # go up x number of dirs
{
  num=$1
  while [ $num -ne 0  ];do
    cd ..
    num=$( expr $num - 1   )
  done
}

Wrócę /home/thina/teamsz apksciebie

goup  6

Oto przykład użycia:

$> pwd
/sys/class/backlight/intel_backlight
$> goup 3
$> pwd
/sys
$> 

Kolejną małą funkcją, którą wymyśliłem, ale nigdy nie używałem jej tak często, jest bookmarkfunkcja.

Oto jak to działa: zapisuje twój bieżący folder w jakimś pliku, a następnie możesz cd do określonego katalogu na podstawie numeru wiersza w tym pliku. Przykład:

$> cd /etc/lightdm
$> bookmark
$> cat ~/.dirsbookmarks                                                                                                  
/home/xieerqi
/sys/class/backlight
/etc/lightdm
$> cd $( awk 'NR==2' ~/.dirsbookmarks  )                                                                                 
$> pwd
/sys/class/backlight

A oto sama funkcja:

bookmark()
{ # bookmarks current dir
  pwd >> $HOME/.dirsbookmarks
}
Sergiy Kolodyazhnyy
źródło
5

UPDATE: Jest jeszcze bardziej skutecznym narzędziem niż autojump: fasd, ale nie jestem z nim zapoznać.


Dziwi mnie, że nikt jeszcze o tym autojumpnie wspominał

działa poprzez utrzymywanie bazy danych katalogów, z których najczęściej korzystasz z wiersza poleceń (katalogi muszą być odwiedzone najpierw, zanim będą mogły zostać przeskoczone).

Zasadniczo jest to, co zbudował @graipher, z kilkoma dodatkowymi opcjami.

Jak wspomniałem w innym pytaniu:

Po kilkukrotnym przejściu do katalogu (nawet raz):

cd /home/thina/teams/td/tech/app/release/apks

możesz użyć skrótu, jaby szybko się tam przenieść, niezależnie od tego, w którym katalogu aktualnie się znajdujesz:

j apks

Pamiętaj, że korzystanie z dowolnej części ścieżki działa, o ile jest najwyższa na liście: j appzabierze Cię również, .../apksjeśli byłeś tam więcej razy niż do .../app.

Poleciłbym go zamiast posiadania własnego skryptu, ponieważ jest dobrze utrzymany, dystrybuowany dla Ubuntu i ma inne fajne funkcje, takie jak przeskocz do dziecka :

.../td/tech $ jc apk
.../release/apks $ 

Został przeniesiony do apksw td, raczej niż niektóre inne apkspod innym drzewie.

Ciprian Tomoiagă
źródło
+1 dla „fasd”. To jest naprawdę przydatne.
Thomas
4

Skróty

Mam listę często używanych katalogów dostępnych bezpośrednio za pośrednictwem aliasu. Obejmuje to również skróty do katalogów w górę hierarchii.

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
alias cdwork=/home/knub/Repositories/work
alias cduni=/home/knub/University

Teraz, gdy chcę przejść trzy poziomy wyżej, po prostu piszę ....<Enter>i już jestem!

knub
źródło
Też mi się podoba, ponieważ chociaż na początku myślałem „hmm 4 okresy na 3 poziomy ...”, to pomyślałem: „O tak ... Komputery! 0 , 1, 2, 3!” : D Teraz łatwe do zapamiętania, przydatne i coś, z czym będę się także bawił. Twoje zdrowie!
P Smith
github.com/bac0n/bash_completion with bash_completion
bac0n
4

Włącz autocdopcję ( shopt -s autocd), abyś nie musiał pisać cd. Na przykład potrzebujesz tylko dwuznakowej komendy, ..aby przejść do katalogu nadrzędnego.

Jeśli nawigujesz między dwoma katalogami, możesz przełączać się między nimi cd -, co prowadzi do poprzedniego katalogu roboczego. autocdOpcja nie robi -bieg cd -ale można zdefiniować alias lub funkcję do tego.

Możesz zapamiętać katalogi na stosie z wbudowanymi pushdi popd. Wbudowany dirswyświetla stos katalogów (uważam, że jest dirs -vbardziej czytelny).

Jeśli często przechodzisz do podkatalogów określonego katalogu, a podkatalogi te mają raczej unikalną nazwę, dodaj je do CDPATHzmiennej. Ostrzegam jednak, że nigdy nie znalazłem takiej sytuacji, w której byłby CDPATHprzydatny.

Możesz ustawić zmienną na nazwę katalogu, a następnie zmienić na nią za pomocą $foo.

Zsh Zainstaluj Zsh ma kilka fajnych funkcji, których bash nie ma. Niektóre z nich można emulować, pisząc funkcje wykonujące tę samą pracę. W szczególności dwuargumentowa forma cdpozwala wygodnie przejść do innego katalogu o podobnej nazwie, np. Z /home/thina/teams/td/tech/app/release/apks/com.acme/v1, biegnie cd release betado /home/thina/teams/td/tech/app/beta/apks/com.acme/v1.

Gilles „SO- przestań być zły”
źródło
2

Jak już odpowiedziałem na powiązane pytanie dotyczące UnixSE, używam do tego skryptu o nazwie z [github] .

Zapamiętuje katalogi, do których przechodzisz, porządkuje je według frecency (częstotliwość + aktualność) i pozwala na przejście do jednej z zapamiętanych ścieżek przy użyciu części jej nazwy.

Po co najmniej raz cd'ed do katalogu możesz zrobić np. Zamiast:

$ cd ~user/very/long/path/with/many/subfolders/

Po prostu zrób:

$ z sub

który będzie działał, wykorzystując częściowe dopasowanie nazw (zakładając, że nie masz innego katalogu zawierającego w ścieżce termin sub i który ma większą frecency).

Zdefiniowałem też taką funkcję, która najpierw próbuje normalnej płyty CD, a jeśli to się nie powiedzie, używa z:

function cd() {
    builtin cd "$1" 2> /dev/null || z "$1" || (echo "cd: File or Directory not found: $1" >&2 && exit 1)
}

To daje najlepsze z obu. Jeśli folder znajduje się w bieżącym katalogu lub podano prawidłową pełną ścieżkę, po prostu tam będzie cd, ale jeśli nie, spróbuje znaleźć dopasowanie w bazie danych i tam cd. To eliminuje (mały) ból związany z czasem konieczności korzystania z cd (do trenowania bazy danych, przechodzenia do folderu, w którym nigdy nie byłeś) i czasem zapominania o używaniu z, jeśli dotyczy.

Graipher
źródło
Czy jesteś pewien, że to cdnie przeszkadza w ztworzeniu bazy danych często odwiedzanych katalogów?
leftaroundabout
czym się różni autojump?
Ciprian Tomoiagă
@leftaroundabout: Nie jestem pewien, ale jak dotąd działa dobrze. z zdecydowanie buduje bazę danych za każdym razem, gdy używasz wbudowanej płyty CD (co moja instalacja próbuje najpierw). Nie jestem jednak pewien, czy baza danych jest aktualizowana, gdy używana jest część Z. EDYCJA: Właśnie przetestowałem, czy baza danych jest aktualizowana podczas wykonywania wbudowanego $ ~ cd ~ / folder / i / have / not / been / to / yet /. To jest.
Graipher
1
@CiprianTomoiaga Rzeczywiście wydaje się, że robi to w zasadzie to samo. Można do tego również użyć zastąpienia polecenia cd, którego używam. Ciekawe wydają się jednak różne polecenia autouzupełniania!
Graipher
btw: Nie jestem autorem z, po prostu uważam, że jest bardzo przydatny.
Graipher
1

Trzy kolejne opcje, które uważam za dobrze działające (choć mogę w przyszłości z nich skorzystać) pushd mogę więcej ich , dopiero się o tym dowiedziałem):

  • Ułóż ścieżki tak, aby nie trzeba było cdzagłębiać się w głęboko zagnieżdżone katalogi, a raczej: miejsca, które musisz często odwiedzać, są na wyciągnięcie ręki. Można to osiągnąć za pomocą dowiązań symbolicznych : zachowaj wyraźne, dobrze zhierarchizowane katalogi takie, jakie są, ale utwórz łącze szybkiego dostępu dla własnej wygody.

    ln -s ~/teams/td/tech/app/release/apks ~/apks

    Następnie zamiast wpisywać długą ścieżkę cd, po prostu użyj cd ~/apksi cd ../teams(lub, w tym przykładzie preferowane,~/teams ), aby wrócić.

  • Nie używaj jednej powłoki i płyty CD w obie strony między ścieżkami, ale utrzymuj jedną powłokę działającą dla każdej ścieżki, w której chcesz pracować. Istnieje wiele poziomów, na których można osiągnąć tę wielozadaniowość:

    • Użyj wielu okien terminali. Działa najlepiej, jeśli okna działają w różnych obszarach roboczych .
    • Używaj wielu kart w jednym oknie. Jest to szczególnie przydatne do wykonywania tylko kilku poleceń w pewnym katalogu: aby wrócić, po prostu zamknij kartę terminala!
    • (Niezbyt rozsądne IMO, ale dla kompletności :) użyj podobnego multipleksera tmux.
    • Po prostu uruchom akcję w poleceniu jednego celu, które znajduje cdsię w folderze, robi jedną rzecz i natychmiast przywraca kontrolę nad oryginalnym folderem: zamiast

      $ cd /home/thina/teams/td/tech/app/release/apks
      $ some_command this_file_here
      $ cd ../../../../..

      po prostu zrób jedną linijkę

      $ (cd ~/teams/td/tech/app/release/apks; some_command this_file_here)

      lub równoważnie

      $ sh -c 'cd ~/teams/td/tech/app/release/apks
      > some_command this_file_here'
  • Nie robić cd w ogóle , ale po prostu wykonywać prawo polecenia z katalogu domowym. Rozszerzenia nawiasów klamrowych mogą tutaj bardzo pomóc: zamiast

    $ cd /home/thina/teams/td/tech/app/release/apks
    $ some_command this_file_here other_file_also_apks
    $ cd ../../../../..

    możesz to zrobić

    $ some_command ~/teams/td/tech/app/release/apks/{this_file_here,other_file_also_apks}
po lewej stronie
źródło
pushdjest bardzo, bardzo przydatne. Możesz dodać więcej informacji o tym, jak z niego skorzystać, aby poprawić swoją odpowiedź.
Sergiy Kolodyazhnyy
@Serg: tak, ale sam znam pushd tylko z odpowiedzi Jos'a powyżej .
leftaroundabout
Ach, rozumiem. Cóż, może to być przydatne do przyszłych odpowiedzi.
Sergiy Kolodyazhnyy
1

Pushd and Popd

Polecenia pushdi popdsą moimi ulubionymi. pushdPolecenie zapamięta odwiedzonych katalogów jest odczytywany za pomocą polecenia dirs, a kiedy jesteś gotowy, aby przejść do tyłu korzystaniapopd do powrotu.

Oto przykład użycia funkcji i aliasów bash:

sd ()
{
    pushd "$1" > /dev/null
}

po ()
{
    popd
}

alias d='dirs'

Ciągle używam kombinacji tych poleceń na różne sposoby.

Skróty

Inną opcją dla często używanych katalogów jest po prostu alias polecenia cdlub pushd. Korzystając z przykładów z Twojego postu:

alias cdapks='cd /home/thina/teams/td/tech/app/release/apks'
alias cdteams='cd /home/thina/teams'

Połączenie

Połącz te dwa pomysły, a możesz nawet mieć to:

alias sdapks='sd /home/thina/teams/td/tech/app/release/apks'
alias sdteams='sd /home/thina/teams'

Co daje dużą elastyczność w przeglądaniu katalogów. I zachować cd***i sd***aliasy na rękę na takie rzeczy jak Desktop, Documents, Music, Downloads, itd. I jest to bardzo wygodne!

tniles
źródło
1

Wypróbuj z.lua - nowe polecenie cd, które pomaga szybciej nawigować, ucząc się nawyków.

  • cd do katalogu zawiera foo:

    z foo
  • cd do katalogu kończy się na foo:

    z foo$
  • użyj wielu argumentów:

    Zakładając następującą bazę danych:

    10   /home/user/work/inbox
    30   /home/user/mail/inbox

    "z in"pojawi się /home/user/mail/inboxjako pozycja ważona o wyższej wartości. Możesz jednak przekazać wiele argumentów do z.lua, aby wybrać inny wpis. W powyższym przykładzie "z w in"zmieniłbym katalog na /home/user/work/inbox.

  • cd z interaktywnym wyborem:

    Gdy znaleziono wiele dopasowań, użycie z -ispowoduje wyświetlenie listy:

    $ z -i soft
    3:  0.25        /home/data/software
    2:  3.75        /home/skywind/tmp/comma/software
    1:  21          /home/skywind/software
    > {CURSOR}

    Następnie możesz wprowadzić numer i wybrać miejsce, w którym chcesz się udać przed faktycznym cd. na przykład. wprowadź 3 do cd do/home/data/software . A jeśli po prostu naciśniesz ENTER i nic nie wprowadzisz, po prostu wyjdzie i pozostanie tam, gdzie byłeś.

    z.luaobsługuje również fzfinteraktywny wybór lub uzupełnianie argumentów:

    zakończenie z fzf

  • szybko wróć do rodzica bez pisania cd ../../.. :

    Nowa opcja "-b"może szybko wrócić do określonego katalogu nadrzędnego w bash zamiast zamiast nadmiarowego wpisywania „cd ../../ ..”:

    • (Bez argumentu) : cdw katalogu głównym projektu, w katalogu głównym projektu znajduje się najbliższy katalog nadrzędny z .git/ .hg/ .svnw nim.

    • (Jeden argument) : cddo najbliższego rodzica zaczynającego się od słowa kluczowego, jeśli nie można znaleźć, przejdź do rodzica zawierającego słowo kluczowe.

    • (Dwa argumenty) : zamień pierwszą wartość na drugą (w bieżącej ścieżce).

    ...

    Zacznijmy od aliasu z -bdo zb:

    # go all the way up to the project root (in this case, the one that has .git in it)
    ~/github/lorem/src/public$ zb
      => cd ~/github/lorem
    
    # cd into to the first parent directory named g*
    ~/github/vimium/src/public$ zb g
      => cd ~/github
    
    # substitute jekyll with ghost
    ~/github/jekyll/test$ zb jekyll ghost
      => cd ~/github/ghost/test

Chciałbym, żeby pasowało do twoich potrzeb.

skywind3000
źródło
0

ryba ma kilka fajnych udogodnień do szybkiego poruszania się.

  • Jeśli wpiszesz cd, strzałka w prawo enter, powtarza najnowszą płytę cd.
  • Używając przycisku strzałki w górę cd w prawo, enter, powtarza drugą najnowszą płytę cd.
  • Itp.
  • Ma prevd i nextd, które są często łatwiejsze w użyciu niż pushd i popd.

Ponadto trzymam moje ulubione katalogi symlinkowane do ~ / f, więc mogę cd ~ / f / x, aby dostać się do ~ / foo / bar / baz / experimental-data.

Theodore Norvell
źródło
0

Od dawna używam aliasów dla często używanych katalogów.

Mam również funkcję bash o nazwie ccb (skrót od tworzenia pliku nietoperzy cd - ten pochodzi z dos / windows, gdzie skrypt powłoki .bat ccb.bat utworzyłby inny plik .bat do przejścia do bieżącego katalogu), który tworzy / dołącza aliasy (w pliku .bash_aliases) do bieżącego katalogu.

np .: $ ccb myfav utworzy alias do bieżącego katalogu z aliasem myfav w pliku .bash_aliases i źródłowy plik .bashrc, aby alias był natychmiast dostępny.

Właśnie znalazłem nowe rozwiązanie. To funkcja bash

## USAGE : lj <your_dir>
### lj -- short for LongJump -- (kinda similar to a C function which would jump to an address outside of your current function)
function lj() {
        pushd `find . -type d -name $1 -print | head -n 1`
}

$ lj deeply_nested_dir_name

nie trzeba się niczego uczyć z poprzedniego użycia. Problem, który może nie zostać rozwiązany, to: jeśli w drzewie podkatalogów znajduje się więcej niż 1 katalog o nazwie „nazwa_katalogu_głębnie”, nastąpi przejście do pierwszego katalogu znalezionego przez find.

Ponadto to rozwiązanie nie będzie w stanie przejść do innego drzewa katalogów.

między zakodowanymi na stałe aliasami i wygenerowanymi aliasami a tą nową funkcją lj (), większość moich potrzeb jest zaspokojona.

Oto funkcja bash my ccb () dla każdego, kto chce z niej korzystać

function ccb() {
        foo=$PWD
        echo "" >> ~/.bash_aliases
        echo "alias $1='pushd $foo > /dev/null'" >> ~/.bash_aliases
        source ~/.bashrc
}
anjanb
źródło