3

Я часто в глубине дерева каталогов, перемещаясь вверх и вниз для выполнения различных задач. Есть ли что-нибудь более эффективное, чем идти?/../../..«?

Я думал что-то вроде этого: если я в /foo /bar /baz /qux /quux /corge /grault и хочу перейти в /foo /bar /baz, я хочу сделать что-то вроде 'cdto baz ». Я могу написать для этого некоторый bash-скрипт, но сначала я бы хотел узнать, существует ли он уже в той или иной форме.

4 ответа4

3

Если вы часто «идете куда-то», а затем хотите "вернуться", вы можете использовать стек каталогов bash: pushd чтобы перейти в конкретный каталог, и popd чтобы вернуться туда, откуда вы пришли.

[/tmp]$ mkdir -p some/deep/directory/tree
[/tmp]$ pushd some/deep/directory/tree
/tmp/some/deep/directory/tree /tmp

[/tmp/some/deep/directory/tree]$ pushd ..
/tmp/some/deep/directory /tmp/some/deep/directory/tree /tmp

[/tmp/some/deep/directory]$ popd
/tmp/some/deep/directory/tree /tmp

[/tmp/some/deep/directory/tree]$ popd
/tmp

[/tmp]$

В противном случае $CDPATH в соответствии с предложением JRobert.

2

Сделать CDPATH. Это делает для 'cd' то, что делает PATH для поиска исполняемых файлов. От "Man Bash":

CDPATH Путь поиска для команды cd. Это список каталогов, разделенных двоеточиями, в которых оболочка ищет каталоги назначения, указанные командой cd. Примером значения является ".:~:/ Usr".

2

Вот функция, которая делает то, что вы хотите:

cdto () { cd "${PWD%/$1/*}/$1"; }

Вот еще один удобный:

c2 () {
        local path num
    if (($# != 0))
    then
        path='./'
    fi
    if [[ -z ${1//.} ]]
    then
        num=${#1}
    elif [[ -z ${1//[[:digit:]]} ]]
    then
        num=$1
    else
        echo "Invalid argument"
        return 1
    fi
    for ((i=0; i<num-1; i++))
    do
        path+='../'
    done
    cd $path
}

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

c2 .    # same as cd .
c2 ..   # same as cd ..
c2 ...  # same as cd ../..
c2 3    # also same as cd ../..
c2      # same as cd (which is the same as cd ~)

Я думал, что у одной из оболочек была кумулятивная функция точка-точка-точка (я даже сейчас проверил Vista, и у нее ее не было, хотя Google утверждает, что некоторые версии Windows поддерживают ее).

редактировать

Недокументированная особенность Bash заключается в том, что в именах функций допустимо множество символов. В результате вы можете сделать это:

.. () { cd ..; }
... () { cd ../..; }
.... () { cd ../../..; }
..... () { cd ../../../..; }
0

«cd -» возвращает обратно в каталог, в котором вы последний раз были.

dan@home:/home/dan/ $ cd test/2009/apt/
dan@home:/home/dan/test/2009/apt/ $ cd -
dan@home:/home/dan/ $ 

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