Odpowiednik aliasu dla dowiązania symbolicznego?

18

Muszę często przeskakiwać po kilku katalogach w moim katalogu domowym i męczyć się ich pisaniem. Chciałbym szybszego podejścia, które tradycyjnie byłoby linkiem symbolicznym.

Jednak nie chcę zaśmiecać mojego katalogu domowego dziesiątkami dowiązań symbolicznych. Mógłbym stworzyć ~/links/katalog i zaśmiecać go symbolicznymi linkami, ale nadal jest brzydki. Poza tym mogę chcieć utworzyć dowiązania symboliczne, które zmieniają się każdego dnia (zdefiniowane w .bashrc), aby przejść do katalogu dni obecnych.

Czy istnieje sposób skutecznego aliasu linku symbolicznego, tworząc coś, co zostanie rozpoznane jako link do szybkiej nawigacji, ale tak naprawdę nie pojawi się, gdy zrobię coś lsz mojego katalogu domowego i nie będzie trwać dłużej niż bieżąca sesja?

dsollen
źródło
4
możesz spojrzeć na pushd i popd
Rui F Ribeiro
Uważam, że podejście Jeroena Janssena jest elastyczne i niedrogie w przypadku tej konkretnej potrzeby: jeroenjanssens.com/2013/08/16/…
Theophrastus
2
Jakiej powłoki używasz?
Gilles „SO- przestań być zły”
@Theophrastus Heh - to w zasadzie to, co w swojej odpowiedzi włożyłem nie tak elegancko.
mattdm,
3
nie do końca to, czego szukasz, ale może się przydać, skacząc między dwoma reżyserami: cd -will cddo ostatniego katalogu były poprzednio. Dlatego jeśli zrobisz to dwa razy, wrócisz do miejsca, w którym zacząłeś ... bardzo miło w tej sytuacji "och zapomniałem edytować someFile.txt w poprzedniej lokalizacji" => Po prostu cd -:, edit someFile.txtcd -
dingalapadum

Odpowiedzi:

12

Możesz użyć uzupełniania tabulatorów. Domyślnie w wielu dystrybucjach Linuksa bash jest skonfigurowany tak, że gdy naciśniesz klawisz [TAB], otrzymasz listę możliwych dopasowań, lub jeśli jest tylko jedno dopasowanie, wszystko jest wypełnione. W przypadku cd jest to zwykle lista podkatalogów bieżącego katalogu roboczego. Możesz to zastąpić, ale zamiast tego sugeruję utworzenie aliasu, na przykład jddla „jump directory”:

alias jd=cd

a następnie zdefiniowanie „zakładek”, które chcesz uzupełnić dla jd. Spójrz na stronę podręcznika użytkownika bash, aby uzyskać o wiele więcej opcji (w tym automatyczne generowanie wyników w locie z polecenia lub funkcji), ale najprostszym sposobem jest po prostu lista słów z -W:

complete -W "/ srv / www ~ / tmp ~ / work" jd

Teraz wpisz jdi naciśnij [TAB], a zobaczysz swoje „zakładki”. Wpisz dowolną niejednoznaczną część, a następnie naciśnij [TAB], aby zakończyć. (W powyższym, ~s rozwiń do mojego katalogu domowego, więc pierwszy [TAB] daje mi /, a jeśli uderzę wi [TAB] ponownie, /srv/wwwjest wypełniony.)

Oczywiście, włóż to, ~/.bash_profileaby było trwałe.

Lub możemy przenieść to na wyższy poziom. Utwórz katalog ~/.shortcuts- zaczynając od kropki, będzie on ukryty i nie będzie zajmował ładnego, czystego katalogu domowego - i wypełnisz go symbolicznymi linkami do wybranych katalogów. Następnie umieść to w swoim ~ / .bash_profile:

_list_shortcuts() 
{ 
    COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
    cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd

Definiuje to nieco bardziej skomplikowane zakończenie _list_shortcutstworzenia listy nazw i sprawia, że ​​staje jdsię ona funkcją, a nie prostym aliasem, ponieważ chcemy, aby działała inaczej niż tylko cd. -PFlagę cdczyni go rozwiązać dowiązania symboliczne, więc wszystko staje się przejrzyste magia. Twoje nazwy skrótów nie muszą nawet odpowiadać celom.

Więc:

$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm  8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work

I, dla dodatkowej dawki fantazji, zrób jdlistę wszystkich skrótów, gdy zostanie wykonany bez żadnych parametrów:

jd()
{
    if [[ -z "$1" ]]; then
      (cd ~/.shortcuts; stat -c '%N' *)
    else
      cd -P ~/.shortcuts/$1
    fi
}

Uwaga: używam compgen -W $( cmd )zamiast tego, compgen -C 'cmd'ponieważ ten drugi nigdy dla mnie nie działa i nie rozumiem dlaczego. To może być moje nowe pytanie. :)

mattdm
źródło
bardzo interesujące. Jeden haczyk wciąż wymaga wpisania pełnego linku lub przynajmniej takiego linku, aby stał się niejasny, zanim skończę z jd. Jakiś sposób dodać aliasy do poleceń jd, aby je skrócić? lub uczyń je względnymi do katalogu, w którym, jak sądzę, mogę przechowywać dowiązania symboliczne.
dsollen,
@dsollen Zobacz aktualizację :)
mattdm,
to działało idealnie. Szczerze mówiąc, nie spodziewałem się dobrej odpowiedzi na to pytanie, ale to było dokładnie to, czego chciałem. Spodziewam się dość tego użycia i wydaje mi się, że jest wystarczająco czysty, aby dodać do listy rzeczy, które modyfikuję za każdym razem, gdy dostaję nową maszynę wirtualną (nawet mam zautomatyzowany sposób klonowania moich standardowych zmian środowiskowych do nowego vm lol). Wielkie dzięki. W pewnym momencie, gdy będę miał więcej wolnego czasu, dowiem się, jak działa składnia
KOMPLEKSOWA
18

Aliasy powłoki mają funkcję, którą można wykonać (niektóre) uzupełnianie nazw (zwykle związane tab). Alternatywnie możesz skorzystać z CDPATHfunkcji, która „ostatnio” (w ciągu ostatnich 5-6 lat) została ulepszona w celu obsługi uzupełniania nazw. Jeśli to działa dla Ciebie, ma tę zaletę, że to, co wpisujesz, jest rzeczywistą nazwą katalogu, a nie mnemoniką.

Zgodnie z instrukcją bash

CDPATH
Rozdzielona dwukropkami lista katalogów używanych jako ścieżka wyszukiwania dla cdwbudowanego polecenia.

Dalsza lektura:

Thomas Dickey
źródło
Nie wiedziałem o CDPATHzmiennej środowiskowej, dziękuję. Mogę dodać mój git_reposkatalog do tej zmiennej ....
Wildcard,
16

W przypadku katalogów często odwiedzanych, ale nie zmienianych codziennie, inną opcją jest po prostu posiadanie kilku aliaspoleceń w .bashrcpliku:

alias cdo="cd /u01/app/oracle"
alias cdw="cd /var/www/html" 

Znajomy ma ich około 50; Mam garstkę; Szybko i łatwo. Właśnie

cdo

zmienić katalog na / u01 / app / oracle

Mark Stewart
źródło
W rzeczy samej. Korzystam z tego mechanizmu od wczesnych lat dziewięćdziesiątych.
wallyk
7

Polecam pushdi popd.

Osobiście uważam je za przydatne przy pracach programistycznych / czytaniu kodu źródłowego, gdy zaangażowanych jest wiele katalogów.

Skutecznie implementują strukturę stosu / LIFO, w której wciskasz katalog ( pushd), a następnie popdpobiera go następna komenda katalogu POP ( ).

Tak więc, gdy jesteś w katalogu, możesz:

pushd .

A kiedy musisz go odzyskać, robisz to

popd

Możesz wykonać wiele operacji pushdi wykonać odpowiednie popdpóźniej, aby powrócić do katalogów.

Zostawię tutaj link.

http://www.eriwen.com/bash/pushd-and-popd/

Rui F. Ribeiro
źródło
1
Tego rozwiązania używam również, z wyjątkiem tego, że nie używam popddużo. Wypełniam moją dirslistę (która jest wypełniona pushdpoleceniami) wszystkimi katalogami, które chcę odwiedzić / pracować przez ten kawałek czasu, a następnie uruchomić pushd +1. Następnie mogę przewijać katalogi za pomocą prostego, !puktóry jest bardzo szybki. (Należy pamiętać, że zarówno w Ubuntu, jak i CentOS, pushdjest to jedyne dostępne polecenie w czystej instalacji, które zaczyna się od pu.)
Wildcard
3

Możesz po prostu umieścić je jako zmienne w swoim ~/.bashrc, a wtedy są one tylko $nieobecne.

$ cat ~/.bashrc
if [ "$PS1" ]
then
    export myproj=~/todays/fancy/project
fi

$ cd $myproj
Ewan Mellor
źródło
3

Oczywistą odpowiedzią są zmienne , te symboliczne rzeczy w powłoce, które oznaczają inne rzeczy, podobnie jak dowiązania symboliczne w systemie plików.

path/to/project $ project=$PWD
path/to/project $ cd $elsewhere   # Previously created
path/to/elsewhere $ cd $project
path/to/project $ logout          # Variables gone, as required

W każdej przyzwoitej powłoce dostajesz Tabuzupełnienie nazw zmiennych, co dodatkowo pomaga.

Kaz
źródło