Як швидко перейти в та з глибоко вкладених каталогів через CLI?


16

Ми знаємо, що за допомогою cd <directory>програми відкриється каталог, якщо він існує!

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

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

Чи є якийсь спосіб пропустити введення тексту cdта cd ..? Я використовую Ubuntu 16.04.


Так! Чи є якийсь спосіб пропустити введення тексту cdта cd ..?
gsthina

@GSURENDARTHINA Напевно, ви знаєте, що можете заощадити хоча б кілька натискань клавіш, повернувшись декілька рівнів одночасно, наприклад у вашому випадкуcd ../../../../..
underscore_d

2
Чи є символьні посилання варіантом?
Кишені

1
Ви також можете переглянути CDPATHзмінну в bashдокументах.
чепнер

На випадок, якщо ви не усвідомили: ви можете зробити "cd <directory>" для будь-якого каталогу в поточному робочому каталозі - просто не починайте з косої риски. Отже, для вашого прикладу, якщо ваш робочий каталог зараз "/ home / thina / groups / 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і popdє вбудовані команди bash.


5
Не вдалося б cd -зробити те саме?
edwinksl

5
@edwinksl так, але pushdі popdможе запам'ятати більше ніж один попередній шлях.
Джос

8
Не забудьте dirsперелічити стек каталогу в командах pushd/ popd.
Аронічний

4
Вони описані на сторінці керівництва для bash-вбудованих (7), оскільки вони є bash вбудованими командами. (Або їх також можна знайти на повній сторінці посібника для bash ) Це та сама інформація, що help pushdі help popdви, про яку ви й згадали (як і help dirs), але я подумав, що це зазначу у випадку, якщо люди цікавляться, звідки беруться ці команди.
MT

2
@Jos you неправильно написаноhelp pusdh
Сергій Колодяжний

16

Окрім вже наданих хороших відповідей, ось кілька порад щодо cdефективного використання .

  • cd - поверне вас до останнього каталогу, в якому ви були.
  • cd ../../..підніме вас на 3 рівні одночасно, ви можете використовувати ..позначення, зв'язані разом, щоб "переміститися" на скільки завгодно каталогів.
  • Якщо ви не впевнені, скільки разів хочете рухатися вгору, використовуйте cd .., а потім використовуйте історію баш-клавіш, натискаючи клавішу зі стрілкою вгору, щоб знову використовувати команду.
  • Використовуйте ~для участі в домашньому каталозі поточних користувачів, якщо ви зареєстровані як користувач thina cd ~/teams, приведуть вас до/home/thina/teams
  • Використовуйте автоматичне заповнення Bash для шляхів, клавіша вкладки заповнить розділ шляху в cdкоманді, якщо ви введете частину сегмента шляху, за яким слідує Tab, цей сегмент буде завершений, якщо іншого правильного вибору немає. Наприклад, якщо ви ввели cd /home/thina/teams/td/tпотім натиснуті Tab, слово tech буде заповнене для вас, доки в каталозі td не було інших файлів чи каталогів, які починалися з літери t.

Використання цих порад разом може зробити обхід каталогів cdнабагато менш болючим.


2
Додавання до пункту ~, особливо якщо ви root, ~userшвидко перенесе вас до userдомашнього каталогу.
CVn

Дякую, я не усвідомлював цього, додам це в наступній редакції.
Арронічний

9

Щоб піднятися на дерево декілька рівнів одночасно, ви можете використовувати таку функцію (завдяки Муру за розширену версію):

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 -поведінки.

1
Технічно це функція, а не псевдонім.
Reinier Post

@ReinierPost: Досить правильно! Я відповідно виправив.
parras

2
Пропозиції: -gtзамість >. >є лексикографічним, він порівнює як рядки. Крім того, замість того, щоб будувати шлях, чому б не зробити cd ..цикл for i in $(seq "${1:-1}"); cd ..; done:? Це також може усунути ifстан.
муру

@muru Я погоджуюся з вашим gtзауваженням, але щодо вашої другої пропозиції див. остаточну букву у відповіді. Має сенс для мене.
Оліфаунт - відновити Моніку

1
@Oliphaunt це не особливо складно, ви просто встановите OLDPWDпочатковий шлях. Ось повна версія: paste.ubuntu.com/17990874
muru

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під іншим деревом.


+1 для 'fasd'. Це дійсно корисно.
Томас

4

Псевдоніми

У мене є список часто використовуваних каталогів, безпосередньо доступних через псевдонім. Сюди також входять ярлики для каталогів, що складаються до ієрархії.

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

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


Мені це теж подобається, тому що, хоча спочатку я думав "хм 4 періоди на 3 рівні ...", тоді я подумав: "О так ... Комп'ютери! 0 , 1, 2, 3!" : D Тепер легко запам’ятати, корисно і щось, з чим я теж буду грати. Ура!
P Smith


4

Увімкніть autocdопцію ( shopt -s autocd), щоб не потрібно було вводити текст cd. Наприклад, вам просто потрібна команда з двома символами, ..щоб перейти до батьківського каталогу.

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

Ви можете запам'ятати каталоги на стеку із вбудованими pushdта popd. Вбудований dirsсписок списків каталогів (я вважаю dirs -vбільш читабельним).

Якщо ви часто змінюєте підкаталоги певного каталогу, і ці підкаталоги мають досить унікальне ім’я, додайте їх до CDPATHзмінної. Однак будьте попереджені, що я ніколи не знаходив ситуації, коли б CDPATHнасправді було зручно.

Ви можете встановити змінну до імені каталогу, а потім змінити на неї за допомогою $foo.

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


2

Оскільки я вже відповідав на пов'язане питання щодо UnixSE, для цього використовую скрипт під назвою z [github] .

Він запам'ятовує каталоги, у яких ви перебуваєте на CD, класифікує їх за вільністю (частота + відвідуваність) і дозволяє вам перейти на один із запам'ятовуваних шляхів, використовуючи частину його назви.

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

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

Просто зробіть:

$ z sub

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

Я також визначив функцію, подібну до цієї, яка спочатку пробує звичайний компакт-диск, а якщо це не вдається, використовує z:

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

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


Ви впевнені, що це cdваше не перешкоджає zформуванню бази часто відвідуваних каталогів?
ліворуч близько

чим він відрізняється від autojump?
Ciprian Tomoiagă

@leftaroundabout: Не впевнений, але поки добре працює. z безумовно будує базу даних кожного разу, коли ви використовуєте вбудований компакт-диск (який спершу намагається встановити). Не так впевнений, чи оновлюється база даних, коли використовується частина z. EDIT: Просто перевірено, чи оновлюється база даних при виконанні $ вбудованого cd ~ / папки / i / have / not / was / to / yet /. Це є.
Грайфер

1
@CiprianTomoiaga Дійсно, здається, це в основному те саме. Перезапис команди cd, яку я використовую, також може бути використана для цього. Однак різні команди автозаповнення здаються цікавими!
Грайфер

btw: Я не автор z, просто вважаю це дуже корисним.
Грайфер

1

Ще три варіанти, які, як я вважаю, працюють добре (хоча в майбутньому я можу використовувати pushdбільше, я лише дізнався про це):

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

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

    Тоді, замість того, щоб вводити довгий шлях до cd, просто використовуйте cd ~/apksта cd ../teams(або, у цьому прикладі бажано, ~/teams), щоб повернутися назад.

  • Не використовуйте одну оболонку та компакт-диск назад і назад між шляхами, але тримайте одну оболонку для кожного із шляхів, над якими вам потрібно працювати. Існує кілька рівнів, на яких можна досягти багатозадачності:

    • Використовуйте кілька вікон терміналів. Найкраще працює, якщо вікна живуть на різних робочих просторах .
    • Використовуйте кілька вкладок в одному вікні. Це особливо добре підходить для виконання лише декількох команд у деякому каталозі: щоб повернутися, просто закрийте вкладку терміналу!
    • (Не дуже розумний 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}

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і т.д. , і це дуже зручно!


1

Спробуйте z.lua - нова команда cd, яка допоможе вам швидше орієнтуватися, вивчаючи свої звички.

  • CD в ​​каталог містить foo:

    z foo
  • cd до каталогу закінчується foo:

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

    Якщо припустити таку базу даних:

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

    "z in"буде CD в /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інтерактивний вибір або завершення аргументу:

    завершення з 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

Бажайте, щоб це відповідало вашим потребам.


0

риба має кілька приємних засобів для швидкого пересування.

  • Якщо ви введете cd правою стрілкою enter, вона повторює найсвіжіший cd.
  • Використовуючи cd-стрілку вгору правою стрілкою введення, вона повторює друге найсвіжіше CD.
  • І т.д.
  • Він має prevd та nextd, які часто простіші у використанні, ніж pushd та popd.

Крім того, я зберігаю мої улюблені каталоги з посиланням на ~ / f, тому я можу cd ~ / f / x дістатися до ~ / foo / bar / baz / експериментальних даних.


0

Я давно використовую псевдоніми для каталогів, які часто відвідуються.

У мене також є функція bash під назвою ccb (скорочення для створення файлу cd bat - це виникла в dos / windows, де сценарій оболонки .bat ccb.bat створив би інший .bat файл для переходу до поточного каталогу), який створює / додає псевдоніми. (у файлі .bash_aliases) до поточного каталогу.

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

Я просто знайшов нове рішення. Це баш-функція

## 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 каталогів під назвою "deep_nested_dir_name", то він перейде на 1-шу частину каталогу, знайденого методом find.

Крім того, це рішення не зможе перейти на інше дерево каталогів.

між твердо кодованими псевдонімами та генерованими псевдонімами та цією новою функцією lj (), більшість моїх потреб опікуються.

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

function ccb() {
        foo=$PWD
        echo "" >> ~/.bash_aliases
        echo "alias $1='pushd $foo > /dev/null'" >> ~/.bash_aliases
        source ~/.bashrc
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.