Bash CD вплоть до в определенной папке

Нормальный ПК/ноутбук/ноутбук?

Прикрепите Ubuntu на, и это - она. Никакая мысль не включена.

Нет никаких 'определенных задач для определенных пользователей' аспекта к выбору. Это - все об общественной поддержке, и Ubuntu имеет самое многочисленное сообщество включая Ubuntu SE.

Если Вы нуждаетесь в помощи, заставляя данную настройку оборудования ПК работать с Linux затем, помогает, способны ли ответы Google. То же с программным обеспечением. Помогает, имеете ли Вы .deb файл и можете 'просто нажать на него' вместо того, чтобы иметь для компиляции его из источника. Нет никакой мыслимой причины, почему Вы хотели бы менее популярный дистрибутив. OpenSuSe добирается bigged некоторыми, но не является испорченным Microsoft?

Всем нам нравятся видео и музыка, Ubuntu — быть южноафриканским и не срываемое американскими законами — получает большую лучшую Поддержку кодеков поле. Дистрибутивы Red Hat (включая Fedora) не имеют КОДЕКОВ — и Вы не хотите бесшумный ноутбук, делают Вас?

16
03.06.2011, 12:03
5 ответов

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

function cdroot()
{
  while [[ $PWD != '/' && ${PWD##*/} != 'httpdocs' ]]; do cd ..; done
}

Можно, конечно, назвать функцию вообще, Вам нравится.

Некоторое объяснение: первый тест ($PWD != '/') отказоустойчивое в случае, если Вы делаете cdroot когда Вы не в httpdocs папке. Это остановится, когда Вы доберетесь до корня.

Второй тест (${PWD##*/} != 'httpdocs') немного более сложно. $PWD переменная, содержащая путь текущего каталога. ${PWD##*/} обрезки все до и включая последнюю наклонную черту.

8
27.01.2020, 19:48
  • 1
    Оборотная сторона к этой повторяющейся - то, что Вы теряете свою способность просто сделать a cd - впоследствии для возвращения туда, где Вы были. –  Ezequiel Muns 06.06.2013, 02:45

Мне назвали функцию upto в моем .bashrc, который позволяет Вам подходить к любому каталогу на текущем пути по имени:

upto ()
{
    if [ -z "$1" ]; then
        return
    fi
    local upto=$1
    cd "${PWD/\/$upto\/*//$upto}"
}

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

_upto()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    local d=${PWD//\//\ }
    COMPREPLY=( $( compgen -W "$d" -- "$cur" ) )
}
complete -F _upto upto

Кроме того, у меня есть другая функция jd который позволяет мне переходить к любому каталогу ниже текущего:

jd(){
    if [ -z "$1" ]; then
        echo "Usage: jd [directory]";
        return 1
    else
        cd **"/$1"
    fi
}

Пример:

[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto h[TAB][TAB]
habitat       hippopotamus
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto hippopotamus
[/www/public_html/animals/hippopotamus] $ jd images
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ 
27
27.01.2020, 19:48
  • 1
    Вы могли также добавить псевдоним для upto httpdocs. –  cjm 03.06.2011, 12:54
  • 2
    @drogbane: jd кажется, не работает в каждом случае, Вы возражали бы объяснять, как он работает? –  Cesar 19.01.2012, 08:22
  • 3
    @Cesar, это использует globstar (**). Для активации этой опции в ударе окружают использование shopt -s globstar. –  dogbane 19.01.2012, 10:37
  • 4
    Это так блестяще сделано, мне жаль, что я не мог upvote дважды. –  droope 02.02.2013, 20:18
  • 5
    я включал динамическое shopt обнаружение и активацию в jd функционируйте, см. gist.github.com/Rob--W/5888648. Я только протестировал его с Bash 4.2.45, таким образом, YMMV. –  Rob W 29.06.2013, 01:28

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

cdup() {
    cd "${PWD/\/httpdocs\/*//httpdocs}"
}

Это использует расширение параметра замены Шаблона для замены всего после /httpdocs/ в $PWD с '/httpdocs' '. Это выглядит очень грязным, потому что мы должны выйти из наклонных черт вправо в пути для дифференциации их от наклонных черт вправо в синтаксисе расширения удара. Плюс не выходят из наклонных черт вправо в замещающей строке, таким образом, это также выглядит непоследовательным.

Если существует нет /httpdocs/ в текущем пути затем никакие замены не будут, работают, и это просто изменится на текущий каталог.

Например, замена заменит /a/b/c/httpdocs/e/f/g с /a/b/c/httpdocs и cd в тот каталог.

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

5
27.01.2020, 19:48
  • 1
    Кстати, стоит упомянуть, что это возьмет Вас максимально высоко в иерархии (который является, вероятно, самым полезным вариантом использования так или иначе). –  Ibrahim 15.11.2012, 00:48

Вы могли также поместить что-то вроде этого в свой профиль:

alias cdh='cd $(echo $PWD | sed -e "s/\(.*\/httpdocs\)\/.*/\1/")'

Просто ввод cdh получит Вас к самому верхнему httpdocs каталог в Вашем текущем пути.

3
27.01.2020, 19:48

Это не полностью решает Вашу проблему, но это будет экономить на выполнении cd ../../../../../../ немного. Я заимствовал это из пользовательского сообщения unknown's здесь.


N

каталоги N перехода в дереве каталогов

Вместо ввода

cd ../../../..

Вы просто вводите

up 4

и a

cd -    

возвратит Вас

Поместите функцию в свой .bashrc для использования его.

# (c) 2007 stefan w. GPLv3          
function up {
ups=""
for i in $(seq 1 $1)
do
        ups=$ups"../"
done
cd $ups
}
2
27.01.2020, 19:48

Теги

Похожие вопросы