Korzystanie z cd, aby przejść o kilka poziomów wyżej

39

Mam do czynienia z projektami Java, które często skutkują głęboko zagnieżdżonymi folderami (/ path / to / project / com / java / lang / cokolwiek, itp.) I czasami chcę mieć możliwość przeskoczenia, powiedzmy, 4 poziomów katalogów w górę. Wpisywanie cd ../../../ .. jest uciążliwe i nie chcę linkować. Czy jest jakaś flaga na cd, która pozwala wejść na wiele poziomów katalogów (w mojej głowie byłoby to coś takiego jak cd-u 4)? Niestety nie mogę znaleźć konkretnej strony podręcznika dla cd, zamiast tego otrzymuję bezużyteczną stronę z „wbudowanymi” funkcjami.

Tossrock
źródło
1
Modyfikowanie bash, aby interpretować cd ...gdzie liczba „.” byłaby liczba poziomów do przejścia. Czy spowodowałoby to konflikt, którego nie jestem świadomy?
Dla tych, którzy przyjeżdżają tu dla MacOS można zainstalować zshi Oh My Zshktóry jest lepszą alternatywą bash, a następnie można po prostu zrobić cd ...(kilka punktów), jak powinno być
Dominic

Odpowiedzi:

29

Lub ... spróbuj tego: (yay Google)

Przejdź do katalogu za pomocą ... n:

W poniższym przykładzie, ..4 jest używany, aby przejść o 4 poziom wyżej, ..3, aby przejść o 3 poziom wyżej, ..2, aby przejść o wyższy poziom 2.

Dodaj następujący alias do pliku .bash_profile i ponownie się zaloguj.

alias .. = "cd .."

alias ..2 = „cd ../ ..”

alias ..3 = „cd ../../ ..”

(itp)

Zobacz Hack # 2

cutrightjm
źródło
10
Wolałbym użyć aliasów .., ...a ....ponieważ są one szybsze wpisywanie, ale zasada jest taka sama aliasów oczywiście.
Bernhard
1
@bernhard Serdecznie zapraszamy, ponieważ nie sądzę, aby spowodowało to jakiekolwiek konflikty. Zostawiłem go takim, jakim jest, ponieważ zacytowałem go ze strony internetowej.
cutrightjm
Powłoka 4DOS.EXE dla DOS obsługiwane także cd ..., cd ....itd. To było bardzo wygodne.
Alexios,
..... nie jest szybszy niż ..4, w rzeczywistości jest o 2 znaki wolniejszy ..
Ryan
29

Prosta funkcja z aliasem:

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

(Możesz to zdefiniować, ~/.bashrcjeśli chcesz, w każdym przypadku).

Jest prosty w użyciu:

$ cd.. 10
Grigorij K
źródło
Niezłe! Pracuje dla mnie! Bash 4.3.11
Carlos Nunez,
2
Dobra odpowiedź; warto podkreślić, że jest to lepsze niż rozwiązania, takie jak eval $(printf "cd ..;%.s" $(seq $1)), która cdwiele razy, ponieważ ~-aka $OLDPWDjest ustawiony do katalogu roboczego sprzed wywołania, zamiast do katalogu pośredniego. PS - upraszcza, cd $(printf %.s../ $(seq "$1"))jeśli chcesz.
Toby Speight
10

Proste, zaawansowane technologicznie rozwiązanie, które nie wymaga żadnej konfiguracji. Działa tylko w powłokach zbash edycją poleceń -style.

  • Rodzaj cd ..
  • Naciśnij Up-arrow Returntyle razy, ile potrzeba. Bardzo szybko, jeśli używasz dwóch palców.
Tom Zych
źródło
2
haha, chyba nie zła odpowiedź :)
joshmcode
8

Okazuje się, że poprawną odpowiedzią jest „cd + n”, gdzie n to liczba poziomów, które chcesz przejść. Szkoda, że ​​nie jest to nigdzie udokumentowane!

Tossrock
źródło
17
przynajmniej NIE działa w bash.
HongboZhu,
5
Nie działa w wersji bash 4.2.25 dostarczanej z Debianem. Z ciekawości, jakiego * nix i / lub powłoki używasz?
Alexios
Bash ma wbudowaną funkcję o nazwie dirs[+ n] jako argument i drukuje n-ty unikalny katalog, który został dodany za pomocą pushd. Jeśli alias cddo pushd, to można to wykorzystać. Zauważ jednak, że technicznie nie jest to odpowiedź na pytanie PO, ponieważ ma to związek z unikalnymi katalogami, co oznacza, że ​​zamówienie zmienia się z czasem, gdy wracasz do tych samych katalogów.
Brian Peterson
Tak, pushda popdtakże wybierz opcję [+ n], dlatego jest w stanie działać. Ponadto, choć jest niedoskonały i pośredni, myślę, że można to wykorzystać jako odpowiedź na pytanie. Często odwiedzałeś ostatnio katalogi nad tobą, więc będą one w ostatnich 10 katalogach przechowywanych przez stos katalogów.
Brian Peterson
nie działało dla mnie ...
Vass
4

Możesz napisać funkcję (musi to być funkcja, ponieważ chcesz zmienić stan samej powłoki, a mianowicie katalog roboczy; polecenie zewnętrzne wpłynęłoby tylko na jej własny proces).

Oto funkcja, która pójdzie w górę do liczby poziomów przekazana jako argument (domyślnie 1) w fizycznej strukturze katalogów (Tak, jak cd -P .., n razy):

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'}$;;')/";
}

Użyj tego w ten sposób:

up 4
mgild
źródło
1
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, dlaczego i / lub jak ten kod odpowiada na pytanie, poprawia jego długoterminową wartość.
Kaczor Donald
1
Zgadzam się, dodałem kilka komentarzy, aby pomóc.
mgild
Być podejrzanym, czy nie jest tak up 4naprawdę równoznaczne z cd /some/dir/zakładaniem $PWD = "/some/dir/that/is/deeply/nested/"?
snapfractalpop
2

Niezupełnie o co prosisz, ale powinieneś spojrzeć na pushdi popd. Uważam, że są one znacznie bardziej przydatne do nawigacji po folderach niż niektóre cd...aliasy

Jeśli przechodzisz w tę iz powrotem z kilku ustalonych obszarów, zwykle stosuje się aliasy.

alias proj1='cd /some/dir/containing/proj1'
alias proj2='cd /some/deeper/dir/structure/containing/proj2'
Rich Homolka
źródło
1

Zamiast używać aliasów możesz również użyć następującej funkcji bash:

function mcd() {
  up=""

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

  cd $up
}

(lub jako jedną wkładką: function mcd() { up=""; for ((i=1; i<=$1;i++)); do up="${up}../"; done; cd $up; })

Dodanie tego do ~/.bashrcpliku sprawi, że będzie ono dostępne w twoim terminalu, a zbudowanie ciągu ../../../../../../przed wywołaniem cdumożliwi również użyciecd - powrót do katalogu startowego.

Bardziej pomocna implementacja może również zawierać pewne kontrole wprowadzane przez użytkownika:

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
}
Kogo to obchodzi
źródło
0

Czy wiesz o autojump ? Jest to hack innej firmy, ale może być przydatny w twoim scenariuszu.

Anonimowy Czyhacz
źródło
0

Wypróbuj rzadko używany parametr środowiska CDPATH . Wówczas może nie być konieczne jawne ustawienie poziomu.

Przykład:

$ 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

Jeśli pracujesz nad wieloma projektami, możesz zmienić ustawienie CDPATH w plik środowiska specyficzny dla projektu. I uruchom go z podkładką dystansową dla dodatkowej automatyzacji.

Często używam pushd i popd. Zwykle używam CDPATH, aby pozwolić mi przeskakiwać między drzewami projektów, a nie podkatalogami w projekcie - ale w tej chwili pracuję nad wieloma małymi projektami, a nie kilkoma dużymi. :)

JezC
źródło
0

Jeśli jesteś już w katalogu docelowym:

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 % 
masm
źródło
0

Spojrzeć na DirB . Jest to skrypt BASH, który umożliwia tworzenie zakładek w następujący sposób:

OPERACJE

  • s Zapisz zakładkę katalogu
  • g przejdź do zakładki lub nazwanego katalogu
  • p wepchnij zakładkę / katalog na stos katalogu
  • r usuń zapisaną zakładkę
  • d wyświetl ścieżkę do katalogu z zakładkami
  • sl wydrukuj listę zakładek do katalogu

Bardzo prosty, bardzo skuteczny.

rseal
źródło
0

Krok dalej od odpowiedzi @ Grigory:

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

To jest :

// go up 1 directory level 
$cdd

// go up 3 directory level 
$cdd 3
qun
źródło
0

Miałem dość tego samego problemu i w rezultacie napisałem cd-plus . Narzędzie CLI z jednym plikiem, które pozwala na przechowywanie wielu katalogów.

Stosowanie

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

echo `pwd` # /foo/bar/
Kevin S Lin
źródło
0

Dodanie poniższego kodu do .bashrcrozszerzenia spowoduje rozszerzenie cdnotacji trzy kropkowej

_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

Po uruchomieniu tego fragmentu w powłoce bash, pisanie cd .../i klikanie <TAB>zakończy ścieżkę do../../ i wyświetlenie względnych ścieżek wszystkich katalogów, które są na przykład o dwa poziomy wyżej.

Aktualizacja : bash-completionnależy zainstalować, aby mieć dostęp do _cdmetody wymienionej w powyższym kodzie. Można go zainstalować za pomocą większości menedżerów pakietów wiersza poleceń

Grant Humphries
źródło