Есть ли команда для возврата на несколько шагов в каталоге без использования cd?


14

Я постоянно иду "CD ../../../../". Есть ли команда / псевдоним, который может позволить мне перейти 'cmd 4', и я вернусь 4 каталога?


ls? Конечно, вы имеете в виду cd?
Крис Джестер-Янг

Да, я просто написал это в спешке;) Редактирование сейчас.

Как это сделать ?:alias cmd5 = "cd ../../../../../"
ypercubeᵀᴹ

Ну, я полагаю, я мог бы выписать их от 1 до 10 или около того, но было бы неплохо иметь умный способ сделать это. Это не совсем подходит мне. Сделаем это, если не найдется другого решения.

Ответы:


16

Поместите это в свой ~/.bashrc:

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

(Название cdupпроисходит от соответствующей команды FTP, только к вашему сведению.)


Спасибо за ответ, согласился с ответом jleedev, потому что он был на 1 строчку короче, и я не мог определиться с выбором! Спасибо, в любом случае!

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

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

11

Меня учили использовать «pushd» и «popd» для таких обстоятельств.

Например, введите «pushd». а затем «CD / Home». Теперь введите «popd», и вы вернетесь туда, откуда начали.

«pushd» / «popd» - это стек, вы можете помещать туда столько каталогов, сколько захотите, но он включается в последнюю очередь, сначала при запуске popd.


Хм, хорошо. Не слышал об этом. Не совсем соответствует тому, что я искал, но и этим воспользуюсь. Благодарю.

10

Конечно, почему бы и нет

up () {
    [$ # = 0] && cd .. && return
    [$ 1 = 0] && return
    cd .. && up $ (($ 1 - 1))
}

Баш не рекурсивный, верно? Вы можете стек переполнение, если вы делаете up 500. :-)
Крис Шестер-Янг

6
Если ваши каталоги вложены так глубоко, у вас есть мои симпатии.
Джош Ли

Использовал это. Обыграй Криса на 1 строчку;)

@Muu: я не знал, что этот вопрос был кодом гольф! ;-) Кстати, присоединяйтесь к нам! 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 old new
    это была функция скрипта, которую я написал в прошлом, которую я использовал для перемещения между похожими деревьями. По сути, он взял два аргумента и сделал регулярное выражение на вашем пути, отлично подходит для перемещения между ветвями и тому подобным. Например, если вы были в ~ / bzr / web / trunk / path / to / feature и вам нужно было перейти в ~ / bzr / web / feature-branch / path / to / feature, тогда вы бы это сделали cdd trunk feature-branch. Реализация, которую я имел, была на архаичном языке оболочки в AIX, но она была довольно тривиальной, поэтому ее легко реализовать в выбранной оболочке, если вам это нужно. Для нас это было очень полезно, потому что структура выглядела следующим образом: ... / {product} / {version} / {release} / {src, bld, dbg, pkg, tst} / {component} / ... так перемещается в этом дереве стало безумно довольно быстро.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.