Як я можу перейти до попереднього каталогу, а не підніматися вгору?


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 

яка змінює попередній робочий каталог, а потім записує його ім'я.


7
Майте на увазі, що це дійсно залежить від оболонки, яку ви використовуєте, і оскільки ви не вказали, важко дати неіснуючу "портативну" відповідь.
Рандаль Шварц

16
@Randall, Можливо, ви могли б поєднати всі ваші індивідуальні коментарі до оболонки в одну відповідь Вольтрон-Шелл.
hyperslug

@Randall. Я використовував bash. Він також працює в ksh і zsh. До речі, я вперше навчився програмувати з видання 1994 року Learning Perl, тому вибачте мене, коли я трохи почитаю. :)
Іцчак

Хм, я 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на стек.


pushd і popd доступні не у всіх оболонках.
Рандаль Шварц

5
@ Wiesław: Дійсно? Я бажаю Баш було що ... Звичайно, я міг би псевдонім cdдо pushd, і це було б в основному те ж саме.
Кріс Чарабарук

3
Або псевдонім pd для pushd і мають обидва. BTW pushd (або pd, якщо ви його псевдонімом) сам заміняє поточний каталог та останній надісланий каталог, фактично виконуючи те, що робить "cd -".
JRobert

Мені подобаються концепції, але ніколи до них не звикали.
Thorbjørn Ravn Andersen

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

2
"j" - явно специфічна оболонка. Ти цього не сказав.
Рандаль Шварц

3
@Randal: Як це оболонка? Це програма.
Fixee

3
Я ідіот. :) Я це зараз бачу.
Рандаль Шварц

10

Окрім cd -іcd $OLDPWD

Ви можете використовувати пошук історії, натискаючи CTRL-Rта набираючи кілька літер cdкоманди, яку ви ввели раніше. CTRL-RПовторне натискання принесе старі матчі.

Цей спосіб стане більш корисним, якщо у вас є більше двох шляхів до змін.


1
CTRL-R не обов'язково допоможе. Можливо, ви були в / some / незрозумілому / директорії / deep і зробили "cd evendeeperdir", тоді перейшли до ~ / somehere / different.
Justintime

1
Чудово! Це працює для інших речей, ніж cd, чудова допомога!
Нілокт

9

Ви можете використовувати це, щоб легко створити псевдоніми для каталогів:

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

a 1

і пізніше:

1

1
Тільки на оболонці, яка розуміє псевдоніми та функції. Не всі так роблять.
Рандаль Шварц

так це пропускає набравши alias =деталі? hmmmm
Xen2050

6

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

Щоб зробити закладку папки, просто перейдіть до цієї папки, а потім зробіть закладку так:

bookmark foo

Закладка буде названа "foo". Коли ви хочете повернутися до цієї папки, використовуйте:

go foo

Щоб переглянути список закладок:

bookmarksshow

Завершення вкладки працює, щоб перейти до закладки shoobie, просто:

go sho[tab]

4

Іншою можливістю буде просто тримати два вікна відкритими, причому одне розміщується в кожному каталозі.


Немає спільної історії, якщо ви регулярно використовуєте / редагуєте попередні команди (можливо, скидання отримає їх ...?)
Xen2050

@ Xen2050 Дивіться варіант оболонки share_historyв zsh.
Радон Росборо

4

Я знаю, що це не суто відповідь на ваше запитання, але це корисно для досягнення мети - відвезти вас у ваші важливі каталоги .

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

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

export CDPATH='.:~/source/'

cd спочатку здійснює пошук у вашій поточній папці, потім пошук у моєму коді-проект-каталог.

cd myproject

.. переносить мене до ~ / джерел / мійпроект з того місця, де я зараз стою.

Проста маленька функція, яка дуже допомогла моїй навігації по каталогу.


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


2

промінь

У мене є власний інструмент, але я також ознайомлюся з інструментом «Дерекс» j.

Звичайно, перший вибір для стрибків вперед і назад - це

cd -

Мій інструмент призначений для каталогів з унікальними іменами в системах, де locateце доступно; він шукає відповідне ім'я каталогу і переходить до першого збігу:

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

Залежності:

  • знайти
  • греп
  • голова

Недоліки:

  • новіші каталоги, ніж останній оновлений запуску, не знайдені
  • якщо збігається декілька каталогів, це залежить від вашої удачі, чи будете ви передані на той, який ви мали на увазі.

Покращення / модифікації:

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

Використання:

  • помістіть функцію у вас /etc/bash.bashrc або ~ / .bashprofile, щоб використовувати її зручним способом.

Перевага мого рішення:

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