32

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

13 ответов13

25

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

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

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

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

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

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

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

(так далее)

Смотрите Hack # 2

22

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

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

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

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

$ cd.. 10
9

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

  • Тип cd ..
  • Нажмите стрелку вверх Возврат столько раз, сколько необходимо. Очень быстро, если вы используете два пальца.
8

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

3

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

Вот функция, которая поднимется на несколько уровней, переданных в качестве аргумента (по умолчанию 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
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

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

ОПЕРАЦИИ

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

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

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, чтобы позволить мне переключаться между деревьями проекта, а не подкаталогами в проекте - но в данный момент я работаю над множеством небольших проектов, а не над несколькими большими проектами. :)

0

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

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

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

echo `pwd` # /foo/bar/
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
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 % 
0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .