Чи є команда для повернення декількох кроків у каталог, не використовуючи CD?


14

Я постійно йду 'cd ../../../../'. Чи є команда / псевдонім, яка могла б відпустити мене "cmd 4", і я отримав би назад 4 каталоги?


ls? Звичайно, ти маєш на увазі cd?
Кріс Єстер-Янг

Так, я просто написав це поспіхом;) Редагуючи це зараз.

Wiil this do ?:alias cmd5 = "cd ../../../../../"
ypercubeᵀᴹ

Що ж, я думаю, я міг би їх виписати від 1 до 10 або близько того, але було б непогано мати розумний спосіб зробити це. Це не дуже сильно зі мною. Зробимо це, якщо не з’явиться іншого рішення.

Відповіді:


16

Помістіть це у своєму ~/.bashrc:

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

(Назва cdupпоходить від відповідної команди FTP, просто FYI.)


Дякую за відповідь, пішов з відповіддю jleedev через те, що він на 1 рядок коротший, і я не міг вирішити, кого вибрати! Все одно, дякую!

@Muu: Обидві відповіді спрацюють, але моя працюватиме на багатьох, багатьох рівнях, а @ jleedev працюватиме лише для невеликої жменьки (незалежно від межі стека). ;-) (Я впевнений, що ви ніколи так і не вдаритеся до межі, але моя більш загальна, це те, до чого я намагаюся потрапити. :-))
Кріс Єстер-Янг

Справедливий момент, я тобі тоді нагороду відповів. Вибачте jleedev - хоча, швидше за все, я продовжуватиму використовувати ваше рішення, оскільки забуду його змінити :)

11

Мене вчили використовувати "pushd" і "popd" для таких обставин.

Наприклад, введіть "pushd". а потім 'CD / home'. Тепер наберіть 'popd', і ви повернетесь туди, де почали.

'pushd' / 'popd' - це стек, ви можете натискати на нього скільки завгодно каталогів, але він останній увімкнено, спочатку при popd.


Гм, приємно. Не чув про це. Не зовсім підходить те, що я шукав, але і це використаю. Спасибі.

10

Звісно, ​​чому б ні:

вгору () {
    [$ # = 0] && cd .. && return
    [$ 1 = 0] і повернення
    cd .. && up $ (($ 1 - 1))
}

Bash не хвостово-рекурсивний, правда? Ви можете укладати переповнення, якщо це зробити up 500. :-)
Кріс Єстер-Янг

6
Якщо ваші каталоги вкладені так глибоко, у вас є мої симпатії.
Джош Лі

Використовували це. Удар Кріса на 1 лінії;)

@Muu: Я не знав, це питання було кодом гольфу! ;-) BTW, приходьте до нас! codegolf.stackexchange.com
Кріс

3
@Muu Будь ласка, пам’ятайте, що рекурсія - це не правильний спосіб написання скриптів оболонки взагалі.
Джош Лі

4

Швидкий і брудний:

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

Сформульовано для зміни каталогу лише один раз.


2

Ось альтернативний спосіб:

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

1

Можливо, ви захочете вивчити використання pushd та popdвстановити маркери місцеположення та легко повернутися туди з будь-якого каталогу, який ви змінили.

Ви також можете встановити змінну з іменем каталогу, який ви багато використовуєте, а потім CD там:

MYPROJ=~/projects/name/src
cd $MYPROJ
proj1='cd $MYPROJ'

1

Я використовую autojump, який дозволяє мені набрати:

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

це може навчитися вашим звичкам і дуже легке (і звикання;))


1

Побудуйте шлях, використовуючи printfпотім cdйого:

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

Використовувати як:

cdup 4 # to go up four directories
cdup 1 # to explicitly go up one directory
cdup   # to implicitly go up one

0

Дві думки, які можуть вам бути корисними:

  1. cd -
    повернення до останнього каталогу, в якому ви були. Я використовую це весь час, щоб перейти з глибокого вниз у моє дерево коду назад до кореня ... хоча це працює лише, якщо ви введете його в один змінити.

  2. CDD старий новий
    це була функція сценарію, про яку я писав у минулому, що я використовував для переміщення між подібними деревами. В основному це взяло два аргументи і зробило зворотний перехід на вашому шляху, відмінно підходить для переміщення між гілками і подібними. Наприклад, якщо ви знаходитесь в ~ / bzr / web / trunk / path / to / feature і вам потрібно було дістатися до ~ / bzr / web / feature-branch / path / to / feature, то ви б це зробили cdd trunk feature-branch. Реалізація, яку я мав, була в архаїчній мові оболонки на AIX, але вона була досить тривіальною, тому вона повинна бути простою для реалізації в оболонці за вибором, якщо вона вам потрібна. Для нас це було дуже корисно, оскільки структура виглядала так: ... / {product} / {версія} / {реліз} / {src, bld, dbg, pkg, tst} / {компонент} / ... так рухається в тому дереві досить швидко зненацька.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.