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?


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.)


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.


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 $))
}

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.


2

Oto alternatywny sposób:

function cdup
{
    cd $(for ((i=0 ; i<$1 ;i++)); do printf "../" ; done)
}

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'

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;))


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.