Как быстро перейти в и из глубоко вложенных каталогов через CLI?

16

Мы знаем, что использование cd <directory>откроет каталог, если он существует!

Кроме того, cd ..поднимет нас на один уровень от текущего рабочего каталога.

Но когда у нас есть вложенный /home/thina/teams/td/tech/app/release/apksкаталог с более длинным путем, например , утомительно просто заходить в папку, apksа также трудно вернуться к другому узлу, скажем здесь /home/thina/teams.

Есть ли способ пропустить ввод cdи cd ..? Я использую Ubuntu 16.04.

gsthina
источник
Ага! Есть ли способ пропустить ввод cdи cd ..?
Гстина
@GSURENDARTHINA Я думаю, вы знаете, что вы можете сохранить хотя бы несколько нажатий клавиш, вернувшись сразу на несколько уровней, например, в вашем случаеcd ../../../../..
underscore_d
2
Симлинки вариант?
Карманы
1
Вы также можете посмотреть на CDPATHпеременную в bashдокументации.
chepner
На тот случай, если вы не поняли: вы можете сделать «cd <directory>» для любого каталога в текущем рабочем каталоге - просто не начинайте с косой черты. Итак, для вашего примера, если ваш рабочий каталог в настоящее время "/ home / thina / team / td / tech / app / release", вы просто наберете "cd apks"
jcadcell

Ответы:

30

Есть pushdи popd:

pushd /home/thina/teams/td/tech/app/release/apks
# current directory now /home/thina/teams/td/tech/app/release/apks
popd
# current directory now what it was before pushd command

Попробуйте help pushdи help popdдля большего количества вариантов. Там нет manстраницы, потому что pushdи popdbash встроенные команды.

Jos
источник
5
Не cd -сделал бы то же самое?
edwinksl
5
@edwinksl да, но pushdи popdможет запомнить более одного предыдущего пути.
Джос
8
Не забудьте dirsуказать свой стек каталогов в командах pushd/ popd.
Arronical
4
Они описаны на странице руководства для bash-builtins (7), поскольку они являются встроенными командами bash. (Или их также можно найти на полной странице руководства для bash ). Это та же информация, что help pushdи help popdвы, и вы упомянули (но также help dirs), но я подумал, что упомяну это, если люди будут интересоваться, откуда берутся эти команды.
MT
2
@ Ты ошибсяhelp pusdh
Сергей Колодяжный,
16

В дополнение к уже полученным очень хорошим ответам, вот несколько советов по cdэффективному использованию .

  • cd - вернет вас в последний каталог, в котором вы были.
  • cd ../../..Вы поднимитесь на 3 уровня одновременно, вы можете использовать ..нотацию, соединенную вместе, чтобы «продвинуться» на столько каталогов, сколько захотите.
  • Если вы не уверены, сколько раз вы хотите перейти вверх, используйте cd .., а затем используйте историю bash, нажав клавишу со стрелкой вверх, чтобы снова использовать команду.
  • Используйте ~для доступа к домашнему каталогу текущих пользователей, если вы вошли в систему как пользователь thina cd ~/teams, вы перейдете к/home/thina/teams
  • Используйте автозаполнение Bash для путей, клавиша табуляции завершит раздел пути в cdкоманде, если после ввода части сегмента пути Tabэтот сегмент будет завершен, если другого допустимого выбора нет. Например, если вы набрали, а cd /home/thina/teams/td/tзатем нажали Tab, слово tech будет заполнено для вас, если в каталоге td нет других файлов или каталогов, начинающихся с буквы t.

Совместное использование этих советов может сделать обходные каталоги cdгораздо менее болезненными.

Arronical
источник
2
Добавление к пункту ~, особенно если вы являетесь пользователем root, ~userбыстро приведет вас в userдомашний каталог.
CVn
Спасибо, я этого не осознавал, я добавлю это в следующем редактировании.
Arronical
9

Чтобы подняться в дереве на несколько уровней одновременно, вы можете использовать следующую функцию (спасибо muru за улучшенную версию):

up ()
{
    local old="$PWD"
    for i in $(seq "${1:-1}"); do
        cd ..
    done
    OLDPWD="$old"
}

Тогда вы можете сделать:

$ pwd
/home/thina/teams/td/tech/app/release/apks
$ up 5
cd'ing into /home/thina/teams

Дополнительно:

  • Вызов upбез аргумента эквивалентен тому, cd ..из-за ${1:-1}чего подставляется, $1когда установлено, и в 1противном случае
  • установка OLDPWD после последнего cd ..направлена ​​на сохранение обычного cd -поведения.
Parras
источник
1
Технически, это функция, а не псевдоним.
Reinier Post
@ReinierPost: Достаточно верно! Я исправил соответственно.
Паррас
2
Предложения: -gtвместо >. >является лексикографическим, сравнивается как строки. Кроме того, вместо построения пути, почему бы не сделать cd ..в цикле for i in $(seq "${1:-1}"); cd ..; done:? Это может устранить ifусловие тоже.
Муру
@muru Я согласен с вашим gtзамечанием, но в отношении вашего второго предложения см. последний пункт в ответе. Имеет смысл для меня.
Олифаунт - восстановить Монику
1
@Oliphaunt, это не особенно сложно, вы просто выбрали OLDPWDпервоначальный путь. Вот полная версия: paste.ubuntu.com/17990874
Муру
7

Для длинных имен каталогов используйте переменные с полным путем. Например,

APKS="/home/thina/teams/td/tech/app/release/apks"

Тогда вы можете сделать только cd "$APKS"

Что касается увеличения количества каталогов на x, у меня есть эта функция, определенная в моем .bashrc

goup() # go up x number of dirs
{
  num=$1
  while [ $num -ne 0  ];do
    cd ..
    num=$( expr $num - 1   )
  done
}

Для возврата /home/thina/teamsиз apksвас будет делать

goup  6

Вот пример использования:

$> pwd
/sys/class/backlight/intel_backlight
$> goup 3
$> pwd
/sys
$> 

Еще одна маленькая функция, которую я придумал, но никогда не использовал так много, это bookmarkфункция.

Вот как это работает: он сохраняет вашу текущую папку в некоторый файл, а затем вы можете перейти в конкретный каталог на основе номера строки в этом файле. Пример:

$> cd /etc/lightdm
$> bookmark
$> cat ~/.dirsbookmarks                                                                                                  
/home/xieerqi
/sys/class/backlight
/etc/lightdm
$> cd $( awk 'NR==2' ~/.dirsbookmarks  )                                                                                 
$> pwd
/sys/class/backlight

А вот и сама функция:

bookmark()
{ # bookmarks current dir
  pwd >> $HOME/.dirsbookmarks
}
Сергей Колодяжный
источник
5

ОБНОВЛЕНИЕ: Есть еще более мощный инструмент, чем autojump:, fasdно я не знаком с ним.


Я удивлен, что никто еще не упомянул, autojumpчто

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

Это в основном то, что @graipher построил, с несколькими дополнительными опциями.

Как я уже говорил по другому вопросу:

После того, как вы перейдете в каталог несколько раз (достаточно даже одного):

cd /home/thina/teams/td/tech/app/release/apks

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

j apks

Обратите внимание, что использование любой части пути работает до тех пор, пока оно является самым высоким в списке: оно j appтакже приведет вас к тому, .../apksчто вы заходили туда чаще, чем к .../app.

Я бы порекомендовал его вместо собственного сценария, поскольку он хорошо поддерживается, распространяется для Ubuntu и имеет другие полезные функции, такие как переход к дочернему элементу :

.../td/tech $ jc apk
.../release/apks $ 

Переехал вас apksв td, а не какой - то другой apksпод другим деревом.

Ciprian Tomoiagă
источник
+1 за "Фаст". Это действительно полезно.
Томас
4

Псевдонимы

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

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
alias cdwork=/home/knub/Repositories/work
alias cduni=/home/knub/University

Теперь, когда я хочу подняться на три уровня вверх, я просто набираю ....<Enter>и вот я!

knub
источник
Мне это тоже нравится, потому что поначалу я думал: «Хм, 4 периода на 3 уровнях ...», потом я подумал: «О да ... Компьютеры! 0 , 1, 2, 3!» : D Теперь легко запомнить, полезно и кое-что, с чем я буду играть. Ура!
П Смит
github.com/bac0n/bash_completion с bash_completion
bac0n
4

Включите autocdопцию ( shopt -s autocd), чтобы вам не приходилось печатать cd. Например, вам просто нужна двухсимвольная команда ..для перехода в родительский каталог.

Если вы перемещаетесь между двумя каталогами, вы можете переключаться между ними с помощью cd - , которая переходит к предыдущему рабочему каталогу. autocdВариант не делает -бег , cd -но вы можете определить псевдоним или функцию для этого.

Вы можете запомнить каталоги в стеке с помощью встроенных pushdи popd. Встроенныйdirs список каталогов стек (я считаю, dirs -vболее читабельным).

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

Вы можете установить переменную на имя каталога, а затем изменить его с помощью $foo.

У Zsh Установить зш есть несколько приятных функций, которых нет у bash. Некоторые из них можно эмулировать, написав функции, которые выполняют ту же работу. В частности, форма с двумя аргументами cdпозволяет вам удобно перейти в другой каталог с похожим именем, например, из которого /home/thina/teams/td/tech/app/release/apks/com.acme/v1выполняется cd release betarun /home/thina/teams/td/tech/app/beta/apks/com.acme/v1.

Жиль "ТАК - перестань быть злым"
источник
2

Как я уже ответил на связанный вопрос по UnixSE, для этого я использую скрипт с именем z [github] .

Он запоминает каталоги, в которые вы переходите, ранжирует их по частоте (частота + время) и позволяет вам перейти к одному из запомненных путей, используя некоторую часть его имени.

После cd'ed в каталог хотя бы один раз вы можете сделать, например, вместо:

$ cd ~user/very/long/path/with/many/subfolders/

Просто сделать:

$ z sub

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

Я также определил функцию, подобную этой, которая сначала пробует обычный cd, а в случае неудачи использует z:

function cd() {
    builtin cd "$1" 2> /dev/null || z "$1" || (echo "cd: File or Directory not found: $1" >&2 && exit 1)
}

Это дает вам лучшее из обоих. Если папка находится в текущем каталоге или указан правильный полный путь, она просто перейдет туда cd, но если нет, то попытается найти совпадение в базе данных и скопировать туда. Это устраняет (небольшую) боль, связанную с тем, что иногда приходится использовать cd (для обучения базы данных, перехода в папку, в которой вы никогда раньше не были), а иногда и не забывать использовать z, когда это применимо.

Graipher
источник
Вы уверены, что это cdне влияет на zсоздание базы данных часто посещаемых каталогов?
оставил
чем он отличается от autojump?
Ciprian Tomoiagă
@leftaroundabout: Не уверен, но пока все работает хорошо. z определенно создает базу данных всякий раз, когда вы используете встроенный компакт-диск (который сначала пытается выполнить моя установка). Не уверен, обновится ли база данных при использовании z-части. РЕДАКТИРОВАТЬ: только что проверил, обновляется ли база данных при выполнении $ buildin cd ~ / folder / i / have / not / been / to / still /. Это.
Graipher
1
@CiprianTomoiaga Действительно, кажется, что в основном то же самое. Перезапись команды cd, которую я использую, также может быть использована для этого. Различные команды autocomplete кажутся интересными, хотя!
Graipher
кстати: я не автор z, просто нахожу это очень полезным.
Graipher
1

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

  • Расположите свои пути так, чтобы вам не нужно было cdвначале вкладывать глубоко вложенные каталоги, а точнее: чтобы часто посещаемые вами места всегда были у вас под рукой. Для достижения этого можно использовать символические ссылки : сохраняйте явные, хорошо иерархизированные каталоги такими, какие они есть, но создавайте ссылки быстрого доступа для собственного удобства.

    ln -s ~/teams/td/tech/app/release/apks ~/apks

    Затем, вместо того, чтобы вводить длинный путь cd, просто используйте cd ~/apksи cd ../teams(или, в этом примере предпочтительнее ~/teams) вернуться.

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

    • Используйте несколько окон терминала. Лучше всего работает, если окна живут на разных рабочих местах .
    • Используйте несколько вкладок в одном окне. Это особенно хорошо подходит для выполнения только нескольких команд в некотором каталоге: чтобы вернуться, просто закройте вкладку терминала!
    • (Не очень разумный IMO, но для полноты :) используйте терминальный мультиплексор, как tmux.
    • Просто запустите действие с помощью специальной команды, которая находится cdв папке, выполняет одно действие и немедленно возвращает управление исходной папке: вместо

      $ cd /home/thina/teams/td/tech/app/release/apks
      $ some_command this_file_here
      $ cd ../../../../..

      просто сделай однострочник

      $ (cd ~/teams/td/tech/app/release/apks; some_command this_file_here)

      или эквивалентно

      $ sh -c 'cd ~/teams/td/tech/app/release/apks
      > some_command this_file_here'
  • Не cd совсем , а просто выполнить право команды из вашей домашней директории. Расширения скобок могут очень помочь здесь: вместо

    $ cd /home/thina/teams/td/tech/app/release/apks
    $ some_command this_file_here other_file_also_apks
    $ cd ../../../../..

    ты можешь сделать

    $ some_command ~/teams/td/tech/app/release/apks/{this_file_here,other_file_also_apks}
leftaroundabout
источник
pushdочень очень полезно Вы можете добавить больше информации о том, как использовать его, чтобы сделать ваш ответ лучше.
Сергей Колодяжный
@Serg: да, но я сам знаю толчок только из ответа Джоса выше .
оставил
Ах, я вижу это. Ну, это может быть полезно для будущих ответов.
Сергей Колодяжный
1

Пуш и Попд

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

Вот пример использования функций и псевдонимов bash:

sd ()
{
    pushd "$1" > /dev/null
}

po ()
{
    popd
}

alias d='dirs'

Я постоянно использую сочетание этих команд различными способами.

Псевдонимы

Другим вариантом для часто используемых каталогов является просто псевдоним команд cdили pushd. Итак, используя примеры из вашего поста:

alias cdapks='cd /home/thina/teams/td/tech/app/release/apks'
alias cdteams='cd /home/thina/teams'

комбинирование

Объедините две идеи, и вы даже можете иметь это:

alias sdapks='sd /home/thina/teams/td/tech/app/release/apks'
alias sdteams='sd /home/thina/teams'

Что дает вам большую гибкость при обходе каталогов. Я держать cd***и sd***псевдонимы под рукой для таких вещей , как Desktop, Documents, Music, Downloadsи т.д. , и это очень удобно!

tniles
источник
1

Попробуйте z.lua - новую команду cd, которая поможет вам быстрее ориентироваться, изучая свои привычки.

  • CD в ​​каталог содержит foo:

    z foo
  • cd в каталог заканчивается на foo:

    z foo$
  • использовать несколько аргументов:

    Предполагая следующую базу данных:

    10   /home/user/work/inbox
    30   /home/user/mail/inbox

    "z in"будет в /home/user/mail/inboxкачестве более взвешенного входа. Однако вы можете передать несколько аргументов z.lua, чтобы предпочесть другую запись. В приведенном выше примере, "z w in"затем измените каталог на /home/user/work/inbox.

  • CD с интерактивным выбором:

    Когда найдено несколько совпадений, при использовании z -iотобразится список:

    $ z -i soft
    3:  0.25        /home/data/software
    2:  3.75        /home/skywind/tmp/comma/software
    1:  21          /home/skywind/software
    > {CURSOR}

    Затем вы можете ввести номер и выбрать, куда идти до фактического компакт-диска. например. введите 3 для CD /home/data/software. И если вы просто нажмете ENTER и ничего не введете, он просто выйдет и останется там, где вы были.

    z.luaтакже поддерживает fzfинтерактивный выбор или завершение аргумента:

    пополнение с фзф

  • быстро вернуться к родителю без ввода cd ../../..:

    Новая опция "-b"может быстро вернуться к определенному родительскому каталогу в bash вместо того, чтобы набирать «cd ../../ ..» излишне:

    • (Без аргумента) : cdв корне проекта, корень проекта - ближайший родительский каталог с .git/ .hg/ .svnв нем.

    • (Один аргумент) : cdв ближайший родительский элемент, начиная с ключевого слова, если не найти, перейдите к родительскому элементу, содержащему ключевое слово.

    • (Два аргумента) : заменить первое значение вторым (в текущем пути).

    ...

    Давайте начнем альясинг z -bк zb:

    # go all the way up to the project root (in this case, the one that has .git in it)
    ~/github/lorem/src/public$ zb
      => cd ~/github/lorem
    
    # cd into to the first parent directory named g*
    ~/github/vimium/src/public$ zb g
      => cd ~/github
    
    # substitute jekyll with ghost
    ~/github/jekyll/test$ zb jekyll ghost
      => cd ~/github/ghost/test

Жаль, что это может соответствовать вашим потребностям.

skywind3000
источник
0

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

  • Если вы наберете cd и нажмите стрелку вправо, это повторяет самый последний cd.
  • При использовании cd стрелка вверх-стрелка вправо вводит, он повторяет второй самый последний компакт-диск.
  • И т.п.
  • Он имеет значение prevd и nextd, которые часто проще использовать, чем pushd и popd.

Кроме того, я держу мои любимые каталоги по символическим ссылкам в ~ / f, поэтому я могу cd ~ / f / x, чтобы добраться до ~ / foo / bar / baz / экспериментальные данные.

Теодор Норвелл
источник
0

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

У меня также есть функция bash ccb (сокращение от create cd bat file - она ​​возникла в dos / windows, где сценарий оболочки .bat ccb.bat создаст другой файл .bat для перехода в текущий каталог), который создает / добавляет псевдонимы (в файле .bash_aliases) в текущий каталог.

Например: $ ccb myfav создаст псевдоним для текущего каталога с псевдонимом myfav в файле .bash_aliases и создаст исходный файл .bashrc, чтобы псевдоним был немедленно доступен.

Я только сейчас нашел новое решение. Это функция bash

## USAGE : lj <your_dir>
### lj -- short for LongJump -- (kinda similar to a C function which would jump to an address outside of your current function)
function lj() {
        pushd `find . -type d -name $1 -print | head -n 1`
}

$ lj deeply_nested_dir_name

этому не нужно учиться чему-либо из предыдущего использования. Проблема, которую это может не решить: если в дереве подкаталогов более 1 каталогов с именем «deeply_nested_dir_name», он перейдет к 1-му каталогу, найденному функцией find.

Кроме того, это решение не сможет перейти в другое дерево каталогов.

между жестко закодированными псевдонимами и сгенерированными псевдонимами и этой новой функцией lj (), большинство моих потребностей удовлетворены.

Вот моя функция ccb () bash для тех, кто хочет ее использовать

function ccb() {
        foo=$PWD
        echo "" >> ~/.bash_aliases
        echo "alias $1='pushd $foo > /dev/null'" >> ~/.bash_aliases
        source ~/.bashrc
}
anjanb
источник