Використання CD для підйому на кілька рівнів каталогу


39

Я маю справу з проектами java, які часто призводять до глибоко вкладених папок (/ шлях / до / проект / com / java / lang / що завгодно тощо), а іноді хочуть перейти, скажімо, на 4 рівні каталогу вгору. Введення компакт-диска ../../../ .. - це біль, і я не хочу передати посилання. Чи є якийсь прапор CD, який дозволяє вам підніматися на кілька рівнів каталогів (в моїй голові це було б щось на зразок cd -u 4)? На жаль, я не можу знайти жодної чоловічої сторінки для компакт-диска, натомість просто отримую марну "вбудовану" сторінку.


1
Модифікація bash для інтерпретації, cd ...де число '.' було б кількість рівнів, щоб піднятися вгору. Чи це спричинило б конфлікт, про який я не знаю?

Для тих , хто прибуває сюди для MacOS ви можете встановити zshі Oh My Zshщо є кращою альтернативою , bashа потім ви можете просто зробити cd ...(кілька точок) , як це має бути
Dominic

Відповіді:


29

Або ... спробуйте це: (так, Google)

Перейдіть до каталогу за допомогою ..n:

У наведеному нижче прикладі ..4 використовується для підйому на 4 рівень каталогу, ..3 для підйому на 3 рівня каталогу, ..2 для підйому на 2 рівня каталогу.

Додайте наступний псевдонім до .bash_profile та повторно увійдіть.

псевдонім .. = "cd .."

псевдонім ..2 = "cd ../ .."

псевдонім ..3 = "cd ../../ .."

(тощо)

Дивіться Hack №2


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кілька разів, тому що ~-інакше $OLDPWDвстановлюється в робочу директорію з перед викликом, а не проміжний каталог. PS - це спрощує, cd $(printf %.s../ $(seq "$1"))якщо хочете.
Toby Speight

10

Просте, низькотехнологічне рішення, яке не потребує налаштування. Однак працює лише в оболонках з bashредагуванням команд -style.

  • Тип cd ..
  • Натисніть Up-arrow Returnстільки разів, скільки потрібно. Дуже швидко, якщо ви використовуєте два пальці.

2
ха-ха, не погана відповідь, я здогадуюсь :)
joshmcode

8

Виявляється правильною відповіддю є "cd + n", де n - кількість рівнів, на які потрібно піднятися. Шкода, що це ніде не зафіксовано!


17
принаймні, це НЕ працює в баш.
HongboZhu

5
Не працює на bash 4.2.25, що постачається з Debian. Що з цікавості ви використовуєте * nix та / або оболонку?
Алексіос

Bash має вбудований виклик, dirsякий приймає [+ n] в якості аргументу та друкує n-й унікальний каталог, доданий через pushd. Якщо ви alias cdдо pushd, то ви можете використовувати це. Однак зауважте, що це технічно не є відповіддю на питання ОП, оскільки це стосується унікальних каталогів, а це означає, що замовлення зіпсується з часом, коли ви повернетесь до тих самих каталогів.
Брайан Петерсон

Так, pushdа popdтакож візьміть варіант [+ n], тому це може працювати. Крім того, хоча це недосконало і опосередковано, я думаю, це може бути використане як відповідь на питання. Ви часто відвідували каталоги вище, ніж ви останнім часом, тому вони будуть знаходитися в останніх 10 dirs, що зберігаються в стеці каталогів.
Брайан Петерсон

не працював для мене ...
Vass

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

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файлу зробить його доступним у вашому терміналі, а складання String ../../../../../../перед викликом 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

Спробуйте рідко використовуваний параметр оточення 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

Якщо ви раніше знаходитесь в цільовому каталозі:

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

Погляньте на DirB . Це сценарій BASH, який дозволяє створювати закладки наступним чином:

ОПЕРАЦІЇ

  • s Збережіть закладку каталогу
  • g перейдіть до закладок або іменованого каталогу
  • p натисніть закладку / каталог на стек dir
  • r видалити збережену закладку
  • d відобразить шлях до каталогу до закладок
  • sl надрукувати список закладок каталогів

Дуже просто, дуже ефективно.


0

Крок далі від відповіді @ Григорія:

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

Захворіла цією самою проблемою і в результаті написала компакт-диск плюс . Єдина файлова утиліта CLI, яка дозволяє створювати безліч файлів.

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

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

echo `pwd` # /foo/bar/

0

Додавання нижче код в ваш .bashrcпродовжить cdзавершення «s в честь трьох плюс точка позначення

_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

Після того, як цей фрагмент буде запущений у вашій баш-шкарлупі, введення cd .../та натискання <TAB>завершить шлях до ../../списку відносних шляхів усіх каталогів, наприклад, на два рівні.

Оновлення : bash-completionнеобхідно встановити, щоб мати доступ до _cdметоду, на який посилається вище в коді. Його можна встановити через більшість менеджерів пакетів командних рядків

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