Czy istnieje polecenie cofnięcia o kilka kroków w katalogu bez korzystania z cd?

14

Ciągle gram „cd ../../../../”. Czy istnieje polecenie / alias, które mogą pozwolić mi przejść na „cmd 4” i zabiorę z powrotem 4 katalogi?

studiohack
źródło
ls? Na pewno masz na myśli cd?
Chris Jester-Young
Tak, właśnie to napisałem w pośpiechu;) Teraz edytuję.
Wiil this do ?:alias cmd5 = "cd ../../../../../"
ypercubeᵀᴹ
Cóż, przypuszczam, że mógłbym je zapisać od 1 do 10, ale fajnie byłoby mieć sprytny sposób na zrobienie tego. To tak naprawdę do mnie nie pasuje. Zrobi to, jeśli nie pojawi się żadne inne rozwiązanie.

Odpowiedzi:

16

Umieść to w ~/.bashrc:

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

(Nazwa cduppochodzi od odpowiedniego polecenia FTP, tylko FYI.)

Chris Jester-Young
źródło
Dzięki za odpowiedź, poszedł z odpowiedzią Jleedev, ponieważ był o 1 linię krótszy i nie mogłem zdecydować, kto ma wybrać! W każdym razie dzięki!
@Muu: Obie odpowiedzi będą działać, ale moje będą działać na wielu, wielu poziomach, a @ jleedev będą działać tylko dla niewielkiej garstki (bez względu na limit stosu). ;-) (Jestem pewien, że nigdy nie przekroczysz limitu w żaden sposób, ale mój jest bardziej ogólny, to jest to, co staram się osiągnąć. :-))
Chris Jester-Young
Trzeba przyznać, że odpowiedziałem ci wtedy. Przepraszam, Jleedev - chociaż najprawdopodobniej będę nadal korzystać z Twojego rozwiązania, ponieważ zapomnę go zmienić :)
11

Nauczono mnie używać „pushd” i „popd” w takich okolicznościach.

Na przykład wpisz „pushd”. a następnie „cd / home”. Teraz wpisz „popd”, a wrócisz do miejsca, w którym zacząłeś.

„pushd” / „popd” to stos, możesz wcisnąć tam tyle katalogów, ile chcesz, ale jest on ostatni, pierwszy, kiedy wyskakujesz.

ʍǝɥʇɐɯ
źródło
Hmm, miło. Nie słyszałem o tym. Nie do końca pasuje do tego, czego szukałem, ale też z tego skorzystam. Dzięki.
10

Jasne, czemu nie:

up () {
    [$ # = 0] && cd .. && return
    [1 $ = 0] i zwrot
    cd .. && up $ ((1 - 1 $))
}
Josh Lee
źródło
Bash nie jest rekurencyjny, prawda? Jeśli to zrobisz, możesz przepełnić stos up 500. :-)
Chris Jester-Young
6
Jeśli twoje katalogi są tak głęboko zagnieżdżone, masz moje sympatie.
Josh Lee
Użyłem tego. Pokonaj Chrisa o 1 linię;)
@Muu: Nie wiedziałem, że to pytanie jest golfem kodowym! ;-) BTW, dołącz do nas! codegolf.stackexchange.com
Chris Jester-Young
3
@Muu Pamiętaj, że rekurencja nie jest właściwym sposobem pisania skryptów powłoki w ogóle.
Josh Lee
4

Szybko i brudno:

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

Sformułowany, aby zmienić katalog tylko raz.

Glenn Jackman
źródło
2

Oto alternatywny sposób:

function cdup
{
    cd $(for ((i=0 ; i<$1 ;i++)); do printf "../" ; done)
}
jlliagre
źródło
1

Możesz zajrzeć do używania pushdi popdustawiania znaczników lokalizacji i łatwo wracać z dowolnego katalogu, w którym się zmieniłeś.

Możesz także ustawić zmienną o nazwie katalogu, którego często używasz, a następnie tam CD:

MYPROJ=~/projects/name/src
cd $MYPROJ
proj1='cd $MYPROJ'
Caleb
źródło
1

Używam autojump, który pozwala mi pisać:

j h
>> /home/cjulien
j et
>> /etc

potrafi uczyć się na twoich nawykach i jest bardzo lekka (i uzależniająca;))

Cédric Julien
źródło
1

Zbudować ścieżkę przy printfczym cddo niego:

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

Użyj jako:

cdup 4 # to go up four directories
cdup 1 # to explicitly go up one directory
cdup   # to implicitly go up one
biskup
źródło
0

Dwie myśli, które mogą ci się przydać:

  1. cd -
    wróć do ostatniego katalogu, w którym byłeś. Cały czas używam tego, aby przejść z mojego drzewa kodu z powrotem do jego katalogu głównego ... chociaż to działa tylko wtedy, gdy włączysz go do niego w jednym zmiana.

  2. cdd stary nowy
    to była funkcja skryptu, którą napisałem w przeszłości, której używałem do poruszania się między podobnymi drzewami. Zasadniczo wymagało to dwóch argumentów i regexp na twojej ścieżce, świetny do poruszania się między gałęziami i tym podobne. Na przykład, jeśli byłeś w ~ / bzr / web / trunk / path / to / feature i chciałeś dostać się do ~ / bzr / web / feature-branch / path / to / feature, to zrobiłbyś to cdd trunk feature-branch. Implementacja, którą miałem, była w archaicznym języku powłoki w systemie AIX, ale była dość trywialna, więc powinna być łatwa do wdrożenia w wybranej powłoce, jeśli jej potrzebujesz. Dla nas było to bardzo przydatne, ponieważ struktura wyglądała następująco: ... / {product} / {version} / {release} / {src, bld, dbg, pkg, tst} / {component} / ... więc poruszanie się na tym drzewie szybko oszalało.

cabbey
źródło