Использование CD для перехода на несколько уровней каталогов

39

Я имею дело с проектами java, которые часто приводят к вложенным папкам (/ path / to / project / com / java / lang / что угодно и т. Д.) И иногда хотят иметь возможность перейти, скажем, на 4 уровня каталога вверх. Ввод cd ../../../ .. это боль, и я не хочу символическую ссылку. Есть ли какой-нибудь флаг для cd, который позволяет вам подняться на несколько уровней каталогов (в моей голове это будет что-то вроде cd -u 4)? К сожалению, я не могу найти какую-либо справочную страницу для CD, а просто получаю бесполезную «встроенную» страницу.

Tossrock
источник
1
Модификация bash для интерпретации cd ...числа "." будет количество уровней, чтобы подняться. Может ли это вызвать конфликт, о котором я не знаю?
Для тех, кто приезжает сюда для MacOS, вы можете установить, zshи Oh My Zshэто лучшая альтернатива, bashа затем вы можете просто сделать cd ...(несколько точек), как это должно быть
Доминик

Ответы:

29

Или ... попробуйте это: (yay Google)

Перейдите вверх по каталогу, используя ..n:

В приведенном ниже примере ..4 используется для повышения уровня каталогов на 4, ..3 для повышения уровня каталогов на 3, ..2 для повышения уровня каталогов на 2.

Добавьте следующий псевдоним в .bash_profile и заново войдите в систему.

псевдоним .. = "CD .."

alias ..2 = "cd ../ .."

alias ..3 = "cd ../../ .."

(так далее)

Смотрите Hack # 2

cutrightjm
источник
10
Я предпочел бы использовать псевдонимы .., ...и так ....как они быстрее ввести, но принцип псевдонимов это же, конечно.
Бернхард
1
@bernhard Вы более чем рады, так как я не верю, что это вызовет какие-либо конфликты. Я просто оставил все как есть, потому что процитировал это с сайта.
cutrightjm
Оболочка 4DOS.EXE для DOS также поддерживается cd ..., и cd ....т.д. Это было очень удобно.
Алексиос
..... не быстрее чем ..4, на самом деле это на 2 символа медленнее ..
Райан
29

Простая функция с псевдонимом тоже:

function cd_up() {
  cd $(printf "%0.s../" $(seq 1 $1 ));
}
alias 'cd..'='cd_up'

(Вы можете определить это, ~/.bashrcесли хотите в каждом случае).

Это просто в использовании:

$ cd.. 10
Григорий К
источник
Хороший! Работает для меня! Баш 4.3.11
Карлос Нуньес
2
Хороший ответ; Возможно, вы захотите указать, что это лучше, чем такие решения, eval $(printf "cd ..;%.s" $(seq $1))которые cdнесколько раз, потому что ~-aka $OLDPWDнастроен на рабочий каталог до вызова, а не на промежуточный каталог. PS - это упрощает, cd $(printf %.s../ $(seq "$1"))если хотите.
Тоби Спейт
10

Простое, низкотехнологичное решение, которое не требует настройки. Работает только в оболочках с bashредактированием команды -style.

  • Тип cd ..
  • Нажмите Up-arrow Returnстолько раз, сколько необходимо. Очень быстро, если вы используете два пальца.
Том Зыч
источник
2
ха-ха, не плохой ответ, я думаю :)
joshmcode
8

Оказывается, правильный ответ - «cd + n», где n - количество уровней, которые вы хотите пройти. Жаль, что это нигде не задокументировано!

Tossrock
источник
17
по крайней мере, это не работает в Bash.
ХунбоЖу
5
Не работает на bash 4.2.25, как поставляется с Debian. Из любопытства, какой * nix и / или shell вы используете?
Алексиос
Bash имеет встроенную вызванную функцию, dirsкоторая принимает [+ n] в качестве аргумента и печатает n-й уникальный каталог, который был добавлен через pushd. Если вы alias cdдо pushd, то вы можете использовать это. Тем не менее, обратите внимание, что это технически не является ответом на вопрос OP, потому что это связано с уникальными каталогами, что означает, что со временем порядок будет испорчен, когда вы вернетесь к тем же каталогам.
Брайан Петерсон
Да, pushdи popdтакже выберите опцию [+ n], поэтому она способна работать. Кроме того, хотя это и несовершенно и косвенно, я думаю, это можно использовать как ответ на вопрос. Часто вы недавно посещали каталоги над вами, поэтому они будут в последних 10 каталогах, хранящихся в стеке каталогов.
Брайан Петерсон
у меня не сработало ...
Васс
4

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

Вот функция, которая поднимется на несколько уровней, переданных в качестве аргумента (по умолчанию 1) в физической структуре каталогов (например cd -P .., n раз):

up() {
    # default parameter to 1 if non provided
    declare -i d=${@:-1}
    # ensure given parameter is non-negative. Print error and return if it is
    (( $d < 0 )) && (>&2 echo "up: Error: negative value provided") && return 1;
    # remove last d directories from pwd, append "/" in case result is empty
    cd "$(pwd | sed -E 's;(/[^/]*){0,'$d'}$;;')/";
}

Используйте это так:

up 4
mgild
источник
1
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, повышает его долгосрочную ценность.
Дональд Дак
1
Согласен, я добавил несколько комментариев, чтобы помочь.
mgild
Быть придирчивым, разве up 4не эквивалентно cd /some/dir/предположению $PWD = "/some/dir/that/is/deeply/nested/"?
snapfractalpop
2

Не совсем то, что вы просите, но вы должны изучить pushdи popd. Я считаю их гораздо более полезными для навигации по папкам, чем некоторые cd...псевдонимы

Если вы идете туда-сюда из пары фиксированных областей, обычно нужно иметь псевдонимы.

alias proj1='cd /some/dir/containing/proj1'
alias proj2='cd /some/deeper/dir/structure/containing/proj2'
Рич Гомолка
источник
1

Вместо использования псевдонимов вы также можете использовать следующую функцию bash:

function mcd() {
  up=""

  for ((i=1; i<=$1;i++)); do
    up="${up}../"
  done

  cd $up
}

(или как однострочник: function mcd() { up=""; for ((i=1; i<=$1;i++)); do up="${up}../"; done; cd $up; })

Добавление этого к вашему ~/.bashrcфайлу сделает его доступным в вашем терминале, а построение строки ../../../../../../перед вызовом cdтакже позволит использовать ее cd -для возврата в начальный каталог.

Более полезная реализация может также содержать некоторые проверки пользовательского ввода:

function mcd() {
    if [[ $1 -lt 1 ]]; then
        echo "Only positive integer values larger than 1 are allowed!" >&2
        echo -e "\n\tUsage:\n\t======\n\n\t\t# to go up 10 levels in your directory\n\t\tmcd 10\n\n\t\t# to go up just 2 levels\n\t\tmcd 2\n" >&2
        return 1;
    fi  

    up=""

    for ((i=1; i<=$1;i++)); do
        up="${up}../"
    done

    cd $up
}
Какая разница
источник
0

Вы знаете об автопрыжке ? Это сторонний взлом, но может быть полезен в вашем сценарии.

AnonymousLurker
источник
0

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

Пример:

$ find workspace -type d
workspace
workspace/project1
workspace/project1/com
workspace/project1/com/java
workspace/project1/com/java/lang

$ CDPATH=".:~/workspace:~/workspace/project1:~/workspace/project1/com:~/workspace/project1/com/java:~/workspace/project1/com/java/lang"
$ cd com
$ pwd
~/workspace/project1/com

Если вы работаете с несколькими проектами, вы можете превратить настройку CDPATH в файл среды проекта. И вызвать его с прокладкой для дополнительной автоматизации.

Я склонен использовать pushd и popd довольно часто. Я склонен использовать CDPATH, чтобы позволить мне переключаться между деревьями проекта, а не подкаталогами в проекте - но в данный момент я работаю над множеством небольших проектов, а не над несколькими большими проектами. :)

JezC
источник
0

Если вы ранее находитесь в целевом каталоге:

luna:/tmp % mkdir -p a/b/c/d
luna:/tmp % pwd
/tmp
luna:/tmp % cd a/b/c/d
luna:d % pwd
/tmp/a/b/c/d
luna:d % cd -
luna:/tmp % pwd
/tmp
luna:/tmp % 
MASM
источник
0

Посмотрите на DirB . Это скрипт BASH, который позволяет создавать закладки следующим образом:

ОПЕРАЦИИ

  • s Сохраните закладку каталога
  • г перейти к закладке или названному каталогу
  • p вставить закладку / каталог в стек dir
  • r удалить сохраненную закладку
  • d отображать путь к каталогу с закладкой
  • sl распечатать список закладок каталога

Очень просто, очень эффективно.

rseal
источник
0

Отойдите от ответа @ Grigory:

function cd_up() {
if [ -z "$1" ]; then
    cd ..
else
    cd $(printf "%0.s../" $(seq 1 $1 ))
fi
}
alias 'cdd'='cd_up'

То есть :

// go up 1 directory level 
$cdd

// go up 3 directory level 
$cdd 3
Qun
источник
0

Надоела эта точно такая же проблема, и в результате она написала CD-Plus . Утилита CLI с одним файлом, которая позволяет вам создавать несколько каталогов.

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

echo `pwd` # /foo/bar/foobar/baz/foobaz/bazfoo
d baz

echo `pwd` # /foo/bar/
Кевин С Лин
источник
0

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

_cd_dot_expansion() {
    local path="${COMP_WORDS[COMP_CWORD]}"

    if [[ "${path}" =~ ^\.{3,} ]]; then
        local dots="${BASH_REMATCH}"
        local levels="${#dots}"
        local tail="${path##*...}"
        local expanded_dots='..'

        # the loop starts at two because the first set of dots is
        # assigned to `expanded_dots` when it is initialized
        for (( i = 2; i < "${levels}"; i++ )); do
            expanded_dots+='/..'
        done

        path="${expanded_dots}${tail}"
        COMPREPLY=( $( compgen -A file "${path}" ) )

        return
    fi

    _cd
}

complete -o nospace -F _cd_dot_expansion cd

Как только этот фрагмент будет запущен в вашей командной оболочке bash, при вводе cd .../и вводе <TAB>пути будет указан полный путь ко ../../всем каталогам, например, на два уровня выше.

Обновление : bash-completionдолжно быть установлено, чтобы иметь доступ к _cdметоду, указанному в приведенном выше коде. Это устанавливается через большинство менеджеров пакетов командной строки

Грант Хамфрис
источник