Как я могу перейти к предыдущему каталогу вместо того, чтобы идти вверх?

214

В настоящее время я провожу много своего рабочего времени, перемещаясь между двумя путями, которые находятся очень далеко вниз по дереву и отклоняются друг от друга в корне. Меня поражает, что моя жизнь была бы намного проще, если бы был аргумент, cdкоторый приведет пользователя к последнему каталогу, в котором он находился.

То есть если я в:

/etc/foo/bar/baz/moo

а затем введите:

cd /var/lib/fubarred_app/blargh/logs

Я хотел бы иметь возможность вернуться к первому каталогу без необходимости повторного ввода всего пути.

Ключ памяти не обрезает его, так как я использую достаточно команд в каждом месте, поэтому мне так же сложно вернуться назад и найти нужный путь, как и набрать его самому.

Есть ли короткая команда, которая позволила бы мне перейти в предыдущий каталог?

Ицхака
источник
8
в дополнение к отличному ответу @ bryan , вы можете подумать о создании пары псевдонимов для каждого пути, чтобы вы могли просто напечатать что-то вроде: " bazmoo" или " blarghlog" в приглашении :)
warren
4
Почему бы вам просто не использовать экран GNU ?
Ши
2
Какая оболочка? это имеет огромное значение.
Рэндал Шварц
@ Warren Ditto. это мой любимый способ сделать все. половина того, для чего я использую свой компьютер, теперь имеет свой псевдоним ... =)
ixtmixilix
Фасд потрясающий Проверьте это.
майкинетор

Ответы:

301

Команда

cd -

выполнит нужный вам обмен на большинство основных оболочек, более старый и длинный вариант

cd "$OLDPWD"

который будет использовать переменную среды, которая содержит предыдущий рабочий каталог.


Страница людей POSIX дляcd упоминания:

ОПИСАНИЕ

Если во время выполнения вышеуказанных шагов переменная среды PWD изменяется, переменная среды OLDPWD также должна быть изменена на значение старого рабочего каталога (то есть текущего рабочего каталога непосредственно перед вызовом cd).

ОПЕРАНДЫ

  -   Если в качестве операнда используется дефис, это должно быть эквивалентно команде:

cd "$OLDPWD" && pwd 

который изменяется на предыдущий рабочий каталог, а затем записывает его имя.

Bryan
источник
7
Имейте в виду, что это действительно зависит от используемой вами оболочки, и поскольку вы не указали, было бы трудно дать несуществующий «переносимый» ответ.
Рэндал Шварц
16
@Randall, Возможно, вы могли бы объединить все ваши отдельные комментарии оболочки в один ответ Voltron-Shell.
Гиперслуг
@Randall. Я использовал Bash. Это работает в ksh и zsh тоже. Кстати, я впервые научился программировать в издании Learning Perl 1994 года, так что извините меня, пока я немного фанат. :)
Ицхак
Хм, я использовал cd $OLDPWDдля этого. Хорошо, что обычные оболочки предлагают намного более короткую форму.
ulidtko
2
@sinni Некоторые ароматы делают имеют pushd, по крайней мере , это встроенный в bash.
Slhck
105

В дополнение к ответу Брайана стоит упомянуть, что есть pushdи popd, которые создают каталоги как стек. Это также доступно в Windows NT; однако, это доступно не во всех оболочках.

Например, мы можем перейти к трем различным каталогам, и вы всегда будете видеть свой стек при вызове pushd:

charon:~ werner$ pushd Documents/
~/Documents ~

charon:Documents werner$ pushd ../Movies/
~/Movies ~/Documents ~

charon:Movies werner$ pushd ../Downloads/
~/Downloads ~/Movies ~/Documents ~

И когда вы вызываете popdтри раза подряд, вы попадаете в эти каталоги в стеке в обратном порядке. В то же время, стек будет снова очищен.

charon:Downloads werner$ popd
~/Movies ~/Documents ~

charon:Movies werner$ popd
~/Documents ~

charon:Documents werner$ popd
~

charon:~ werner$ popd
-bash: popd: directory stack empty

Если вы используете Zsh; у него есть опция AUTO_PUSHD, которая автоматически помещает cdв стек.

slhck
источник
pushd и popd доступны не во всех оболочках.
Рэндал Шварц
5
@ Веслав: Правда? Я желаю Баш было что ... Конечно, я мог бы псевдоним cdк pushd, и это было бы в основном то же самое.
Крис Чарабарук
3
Или псевдоним pd для pushd и есть оба. Кстати, pushd (или pd, если вы его называете псевдонимом) меняет местами текущий каталог и каталог последнего нажатия, по существу выполняя то, что делает cd -.
JRobert
Мне нравится концепция, но я никогда не привык к ним.
Турбьерн Равн Андерсен
13

Есть несколько "прыгающих" программ

  • автопрыжок (поддерживается с основными функциями)
  • j2 (очевидно, не поддерживается с некоторыми расширенными функциями)
  • z (поддерживаемая версия "j" с расширенными функциями)

Это облегчает любой вид навигации по каталогам. Вы используете это, давая часть пути, и это просто работает.

В твоем случае

~$ j baz 
/etc/foo/bar/baz/moo$

~$ j bla 
/var/lib/fubarred_app/blargh/logs$

Этим программам вы можете назначить любую букву, которую хотите, «j» - это традиция :)

j2 и z поддерживают несколько условий поиска, ...

~$ j baz src
/home/me/projects/baz/repository/trunk/src$

... и больше вариантов.

~$ j -l  # list directories by "frecency"(frequency + recency) score
~$ j -r PATTERN # match by rank only, not recency
~$ j -t PATTERN # match by recency only, not rank
hayalci
источник
2
«j» явно относится к оболочке. Ты этого не говорил.
Рэндал Шварц
3
@Randal: Как это зависит от оболочки? Это программа.
Fixee
3
Я идиот. :) Я вижу это сейчас.
Рэндал Шварц
10

В дополнение к cd -иcd $OLDPWD

Вы можете использовать поиск по истории, нажав CTRL-Rи набрав несколько букв cdвведенной ранее команды. CTRL-RПовторное нажатие приведет к старым совпадениям.

Этот метод будет более полезным, если у вас есть более двух путей для изменения.

Musa
источник
1
CTRL-R не обязательно поможет. Возможно, вы были в / some / obscure / directory / deep и сделали "cd evendeeperdir", а затем перешли в ~ / somehere / different.
Justintime
1
Большой! Это работает для других вещей cd, отличная помощь!
Niloct
9

Вы можете использовать это, чтобы легко создавать псевдонимы для каталогов:

a() { alias $1=cd\ $PWD; }

a 1

и позже:

1
Мистер Пример
источник
1
Только на оболочке, которая понимает псевдонимы и функции. Не все так делают.
Рэндал Шварц
так что пропускает набор alias =частей? хммм
Xen2050
6

bashmarks позволят вам добавить в закладки ряд папок и переходить между ними с завершением вкладки:

Чтобы добавить в закладки папку, просто перейдите в эту папку, а затем добавьте ее в закладки следующим образом:

bookmark foo

Закладка будет называться «foo». Если вы хотите вернуться в эту папку, используйте:

go foo

Чтобы увидеть список закладок:

bookmarksshow

Закладка завершает работы, чтобы перейти к закладке shoobie, просто:

go sho[tab]
Handyman5
источник
4

Другой возможностью было бы просто держать два окна открытыми, по одному в каждом каталоге.

Алджер
источник
Тем не менее, нет общей истории, если вы регулярно используете / редактируете предыдущие команды (может быть, их получит сброс ...?)
Xen2050
@ Xen2050 См. Параметр оболочки share_historyв zsh.
Радон Росборо
4

Я знаю, что это не является строго говоря ответом на ваш вопрос, но это полезно для достижения цели, чтобы привести вас в ваши важные каталоги .

в любом спуске UNIX-bash вы можете использовать CDPATH для расширения папки, в которой ищет команда cd.

из моего .bashrc-файла:

export CDPATH='.:~/source/'

Сначала CD выполняет поиск в вашей текущей папке, а затем - в моем каталоге coding-project-directory.

cd myproject

... переносит меня в ~ / sources / myproject с того места, где я сейчас нахожусь.

Простая маленькая функция, которая очень помогла моей навигации по каталогам.

phareim
источник
1
+1 Это добавит папку CDPATH в cdсписок автозаполнения (TAB), что хорошо. Но если .оно не включено и если в папке CDPATH есть папка с тем же именем, что и в вашем текущем каталоге, то cd samenameвы перейдете в каталог CDPATH, а не в текущий каталог, что является Плохо. Приходится использовать, cd ./samenameчтобы попасть в двойную папку.
Xen2050
Да, хороший комментарий. Всегда включайте первое . или вы будете испытывать странные вещи.
Phareim
3

Да, cd -это путь, но я переживаю из-за недостатка энергии, который есть в твоей оболочке. popdи pushdтоже хороши, и эта jштука тоже выглядит хорошо.

Я добавлю свою собственную утилиту в кольцо ... это просто то, что я строил, настраивал и переносил со мной последние 10 лет или около того, и это прекрасно работает для того, что я хочу.

Сообщение в блоге для моей утилиты управления каталогами

Если это работает для вас, тогда круто, но если это не так, то пообещайте мне, что вы получите что-то еще :) Вы просто не можете жить в cdодиночестве.

Дерек Уайетт
источник
3

Если у вас есть только 2 каталога, самый простой способ, как уже упоминалось,

cd -

Когда у меня были такие вещи в прошлом, у меня было несколько трюков, которые я сделал, которые могут быть полезны.

  1. Поместите команды псевдонимов в файл .cshrc, что-то вроде этого

    alias moo /etc/foo/bar/baz/moo  
    alias logs cd /var/lib/fubarred_app/blargh/logs
    
  2. Ссылка ярлыков на интересующие пути из моего домашнего каталога. Это разовая вещь.

    cd ~
    ln -s /var/lib/fubarred_app/blargh/logs blargh
    ln -s /etc/foo/bar/baz/moo
    

Это позволит изменить каталог так же просто, как:

   cd ~/moo
   cd ~/blargh
PearsonArtPhoto
источник
2

Autojump - это команда bash / sh / zsh "cd", которая из ваших действий видит это видео .

так что это переместит вас в му после того, как он узнал последние папки

j moo
oluies
источник
2

луч

У меня есть свой собственный инструмент, но я тоже посмотрю на инструмент Дерекс j.

Конечно, первый выбор для прыжков назад и вперед

компакт диск -

Мой инструмент предназначен для каталогов с уникальными именами в системах, где locateэто возможно; он ищет подходящее имя каталога и переходит к первому совпадению:

beam () 
{ 
    ldir=$(locate $1 | egrep "$1$" | head -n 1);
    if [[ -d $ldir ]]; then
        echo $ldir;
        cd $ldir;
    else
        echo "no directory "$ldir;
    fi
}

зависимости:

  • разместить
  • Grep
  • голова

Недостатки:

  • более новые каталоги, чем последний обновленный, не найдены
  • Если более одного каталога совпадают, это зависит от вашей удачи, от того, хотите ли вы перейти к тому, который вы имели в виду.

Усовершенствования / модификации:

  • вместо выбора первого каталога код можно изменить для отображения списка вариантов, предлагая пользователю ввести 1,2,3, ... для перехода в / bin, / usr / bin, / usr / local / bin ...

Использование:

  • поместите эту функцию в /etc/bash.bashrc или ~ / .bashprofile, чтобы использовать ее удобным способом.

Преимущество моего решения:

  • не ограничивается 2 каталогами, как cd -
  • Вам не нужно посещать каталоги один раз, прежде чем использовать луч.
неизвестный пользователь
источник