bash 디렉토리 단축키


28

입력 할 때 cd ~foobash foo는 전체 디렉토리 경로를 입력하는 바로 가기 로 일부 디렉토리 로 이동 하고 싶습니다 foo. 디렉토리에서 홈 디렉토리로 cp ~foo/bar.txt ~/bar.txt파일을 복사 하고 싶습니다 /foo/... 기본적으로 정확히 작동하는 것을 원 ~/하지만 디렉토리의 위치를 ​​지정합니다. [Jfgi를해야한다고 확신하지만 무엇을 해야할지 모르겠다]


zsh 는이를 지원합니다. " 명명 된 디렉토리 " 라고 불린다
Sildoreth

나는 쉘북 마킹 도구를 너무 오랫동안 찾고 있었고 마침내 나는 이전에 본 것보다 훨씬 더 좋아하는 (퍼지 검색 기반) 자체 솔루션으로 끝났다. 이 답변을 확인하십시오 : unix.stackexchange.com/a/209892/46011
Dmitry Frank

답변:


39

내가 사용했던 방법은 바로 가기를 원하는 디렉토리에 대한 심볼릭 링크가 포함 된 디렉토리를 만들고 해당 디렉토리를 CDPATH에 추가하는 것입니다. CDPATH는 cd디렉토리를 전환 할 때 검색 할 위치 를 제어 하므로 해당 symlinks 디렉토리가 CDPATH에 있으면 cdsymlinked 디렉토리로 즉시 이동할 수 있습니다.

mkdir ~/symlinks
ln -s /usr/bin ~/symlinks/b
export CDPATH=~/symlinks
cd b   # Switches to /usr/bin

물론 현재 디렉토리에 "b"라는 디렉토리가 있으면 작동하지 않습니다. CDPATH보다 우선합니다.


나는 보통 "먼저 셸을 전환해야한다"라는 답변을 싫어하지만 , ZSH 에는 정확한 기능이 있습니다 . 이를 named directory 라고 합니다. 변수를 내 보내면 참조 할 때 값이 결정 됩니다. 이것은 다음과 같은 명령에서 작동하기 때문에 특히 편리합니다 .foo~foo$foocd

echo hi > /tmp/test
export t=/tmp
cat ~t/test   # Outputs "hi"

2
이 ZSH 기능은 다음과 다른 점이 있습니다. echo hi> / tmp / test; export t = / tmp; cat $ t / test 적어도 내 컴퓨터에서는 제대로 작동합니다. 유일한 차이점은 입력해야하는 문자입니다.
Steven D

zsh에 op를 참조하는 것이 옳은 일입니다. 나는 그 기능을 15 년 안에 한 번도 놓치지 않았다. 다른 사람들이 신경 쓰지 않는 반면 어떤 사람들은 정말로 집착하는 것 같습니다. 그래서 하나 이상의 쉘이 있습니다.

2
@Steven 꽤 비슷하지만 ZSH는이 경우 이름이 지정된 디렉토리라는 것을 알고 있으므로 프롬프트 확장 및 셸 내장 명령에서 특별히 처리 할 수 ​​있습니다.
Michael Mrozek

[터미널을 사용할 때부터 emacs Mx 쉘을 사용하여이 작업을 수행하고 있었기 때문에 ZSH 솔루션을 배제한 것 같습니다 ...]
Seamus

1
내 .zshrc에 추가하면 효과가 있습니다.
Seamus

10

래퍼 함수를 ​​작성하고 cd"cd"라고 부를 수 있습니다 (결국 키워드를 builtin cd사용하여 함수가 호출 함 builtin). 함수가보기 전에 Bash가 명령 행에서 확장되지 않고 디렉토리 이름의 초기 문자 ( ":")로 표시되지 않는 접두어 문자를 사용할 수 있습니다. 좀 더 강력하게 만들고 싶겠지 만 간단한 개요는 다음과 같습니다.

# format: [semicolon] shortcut colon destination [semicolon] ...
export CDDATA='foo:/path/to/foo;bar:/path/to/bar;baz:/path/to/baz'

cd () {
    local dest=$1
    if [[ $dest == :* ]]
    then
        [[ $CDDATA =~ (^|;)${dest:1}:([^;]*)(;|$) ]]
        dest=${BASH_REMATCH[2]}
    fi
    if [[ -z $dest ]]
    then
        cd
    else
        builtin cd "$dest"
    fi
}

cd :bar    # pwd is now /path/to/bar

1
이것은 정말 좋은 생각입니다
Michael Mrozek


7

bash로 :

~foo사용자 foo의 홈 디렉토리 용으로 예약되어 있습니다. 그 편의를 위해 사용자를 만드는 것은 권장하지 않습니다.

환경 변수 를 설정하여 디렉토리변경할 때 인생을 더 쉬워 지거나 더 어렵게 만들 수 있습니다 CDPATH(에서 찾아보십시오 bash(1)).

그 외에도, 생각할 수있는 유일한 방법은 축약하려는 디렉토리에 대한 환경 변수를 설정하는 것입니다.

$ FOODIR=/var/lib/misc
$ cp ~/bar.txt $FOODIR

2

Bash 변수는 북마크 시스템을 만드는 데 사용될 수 있습니다. 변수는 모든 명령에서 작동하며 bash는 변수 이름을 탭으로 완성합니다. 최신 버전의 bash에서 /가 변수 이름에 추가되면 변수에 포함 된 경로도 탭 완성 될 수 있습니다.

mydir=/home/chris/dir
ls $my         # Tab completion works on variable name.
ls $mydir/     # Tab completion is equivalent to that with ls /home/chris/dir/
               # (doesn't work in older versions of bash).

지속성을 위해 변수 선언은 .bashrc의 소스 파일에 보관할 수 있습니다. 이 파일은 bash 스크립트이므로와 같은 다른 변수를 참조 aur="${HOME}/AUR"하거나 특정 호스트에서만 실행되는 선언을 포함 할 수 있습니다 if [[ $HOSTNAME == foo ]]; then bar=baz; fi. 이는 여러 호스트 및 사용자에서 구성 파일을 재사용 할 때 유용합니다.

다음 bash 기능 (.bashrc에 추가되거나 그 소스로 제공됨)을 사용하면 책갈피 파일에 책갈피를 추가하고 제거 할 수 있습니다. 상당히 새롭고 버그가 없음을 보증하지 않습니다.

bookmark_file=~/.bookmarks
source "$bookmark_file"

bm() {
usage='Usage:
bm add <name> <path>           Create a bookmark for path.
bm add <name>                  Create a bookmark for the current directory.
bm update                      Source the bookmark file.
bm remove <name>               Remove a bookmark'              

case $1 in
    add)
        local path
        if [[ $# -eq 2 ]]; then
            path=.
        elif [[ $# -eq 3 ]]; then
            if [[ -e $3 ]]; then
                path="$3"
            else
                echo "bm: ${3}: No such file or directory."
                return 1
            fi               
        else
            echo "$usage"
            return 1
        fi

        if declare | grep "^${2}=" > /dev/null; then
            echo "bm: The name $2 is in use."
            return 1
        fi
        path=$(readlink -f "$path")
        echo ${2}=\""$path"\" >> "$bookmark_file"
        eval ${2}=\""$path"\"
        return 0
        ;;
    update)
        if [[ $# -eq 1 ]]; then
            source "$bookmark_file"
            return 0
        fi
        ;;
    remove)
        if [[ $# -eq 2 ]]; then
            unset $2
            local contents=$(grep -v "^${2}=" "$bookmark_file")
            echo "$contents" > "${bookmark_file}.tmp"
            rm -f "$bookmark_file"
            mv "${bookmark_file}.tmp" "$bookmark_file"
            return 0
        fi
        ;;
esac

echo "$usage"
return 1
}

0

~c원하는 경로로 대체 되는 cd의 별명을 작성하는 방법이 있습니다 . 아니면 그냥 zsh를 사용하십시오;)


2
예, 별칭 ~ c = "cd / daten / cvs / plugin_root"와 같이 그렇게 생각했지만 cd에만 도움이되지만 명명 된 디렉토리는 모든 명령에 사용할 수 있습니다.
fschmitt

0

디렉토리를 변경하려면 wcd를 사용 하십시오.

그것과 같이 될 것 wcd plugin_root입니다.


나는 다른 명령 cd뿐만 아니라 작동하는 무언가를 원했습니다 ...
Seamus

0

나는 즉시 별칭을 생성하는 아래 기능을 가지고 있습니다.

s () {
    if [[ "x$1" != "x" ]]
    then
        alias $1="cd $PWD;pwd"
        echo "alias $1=\"cd $PWD;pwd\""
    else
        echo "Usage: s[s] <directory bookmark name>"
        return 1
    fi
}

디렉토리를 북마크하고 싶을 때는을 입력하면 s dirName됩니다. 이 같은 별칭을 만듭니다 alias dirName="cd /my/current/directory/;pwd". 을 입력하여이 디렉토리로 돌아올 수 있습니다 dirName. bash_aliases에도 저장하는 버전이 있습니다. 이것은 모든 쉘에서 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.