[unix] bash의“북마크”

여러 계층의 중첩 디렉토리를 탐색하는 것은 종종 고통스러운 일입니다. Firefox에서는 책갈피가 있기 때문에 쉽습니다. 따라서 파일을 책갈피에 추가하려면 다음을 입력하십시오.

$ go --add classes "repo/www/public/util/classes"

그런 다음이 디렉토리로 이동하려면 다음을 입력하십시오.

$ go classes

이전에는 비슷한 링크를 사용하기 위해 심볼릭 링크를 사용했지만 홈 디렉토리를 어지럽히고 싶지 않습니다. 유용한 다른 기능이 많이 있습니다. 예를 들어, 입력을 시작한 go cl다음 탭을 눌러 자동 완성을 수행하고 싶습니다 . 때때로 저장소의 여러 사본이 체크 아웃되어 있으므로 프로그램이 여러 컨텍스트를 작성하고 컨텍스트 기본 디렉토리를 기준으로 책갈피를 설정하는 것이 유용합니다.

내 스크립트 세트를 함께 연결하기 전에 이미 이와 같은 것이 있습니까?



답변

쉘북 마킹 도구를 너무 오랫동안 찾고 있었는데 찾은 솔루션에 만족하지 않습니다.

그러나 결국에는 훌륭한 범용 도구 인 command-line fuzzy finder를 발견했습니다 .

주로 파일을 “퍼지 찾기”할 수 있지만 (위의 링크로 풍부한 GIF 애니메이션 확인) 임의의 텍스트 데이터를 공급하고이 데이터를 필터링 할 수도 있습니다. 따라서 바로 가기 아이디어는 간단합니다. 경로가있는 파일 (바로 가기)을 유지 관리하고이 파일을 퍼지 필터링하기 만하면됩니다. 모양은 다음과 같습니다. cdg원하는 경우 “cd global”의 명령 을 입력 하고 책갈피 목록을 가져 와서 몇 번의 키 입력으로 필요한 항목을 선택한 다음 Enter 키를 누릅니다. 작업 디렉토리가 선택된 항목으로 변경되었습니다.

cdg

매우 빠르고 편리합니다. 일반적으로 필요한 항목을 3-4 자로 입력하면 나머지는 이미 필터링됩니다. 또한 화살표 키 또는 Ctrl+j/로 목록을 이동할 수 있습니다 Ctrl+k.

이 단축키 / 책갈피 솔루션에 대한 자세한 기사는 다음과 같습니다 . 쉘의 퍼지 단축키 .


답변

autojump 와 같은 것을 찾고 있다고 생각합니다 . 주어진 디렉토리에서 소요되는 시간과 관련된 “키 가중치”세트를 개발하려면 약간의 CD를 사용해야합니다. 그런 다음 ‘classes’디렉토리에서 많은 시간을 보냈다고 가정하면 직접 입력하여 거기로 이동할 수 있습니다

j cl

당신은 “키 가중치”를 볼 수 있습니다

jumpstat


답변

언급했듯이 별칭은 좋은 메커니즘입니다. bash 쉘에는 또한 위치로 바로 이동하는 내장 메커니즘이 있습니다 CDPATH. 처럼 설정 PATH하지만 cd프로그램을 검색 하는 대신 사용됩니다 .

$ CDPATH=:~/repo/www/public/util
$ cd classes
/home/casebash/repo/www/public/util/classes

맨 페이지에서 :

   CDPATH The search path for the cd command.  This is  a  colon-separated
          list  of  directories  in  which the shell looks for destination
          directories specified by the cd  command.   A  sample  value  is
          ".:~:/usr".

내 자신, 나는 가고 싶은 곳으로의 심볼릭 링크가있는 디렉토리와 이것을 결합했다.

$ mkdir ~/cdshortcut
$ ln -s ~/repo/www/public/util/classes ~/cdshortcut/classes
$ CDPATH=:~/cdshortcut
/home/casebash/cdshortcut/classes

이 디렉토리는 매우 정확한 것으로 나타나지 않는다는 단점이 있지만, 그 사용하여 수리 할 수 있습니다 cd -P또는 설정 set -P.


답변

Bash의 기존 기록 및 기록 검색 기능을 결합 할 수 있습니다. 을 눌러 Ctrl-R증분 역방향 검색을 시작한 다음 가장 고유 한 경로 부분을 입력하기 시작합니다.

cd해당 디렉토리와 관련된 가장 최근의 명령으로 돌아갈 때까지 문자를 계속 입력 하거나,를 Ctrl-R다시 눌러 기록에서 지금까지 입력 한 내용과 일치하는 다음 최신 명령으로 되돌아 갈 수 있습니다 .

나는 항상 이것을한다.

사실, 한 걸음 더 나아갑니다. 역사에서 유지해야하지만 쉘 스크립트에 커밋 할 가치가없는 일련의 명령을 발견하기 시작 하면 하나의 긴 명령의 하위 문자열을 역 검색 하고 전체 시퀀스를 실행하고 실행할 수 있도록 명령 &&과 결합기를 연결하기 시작 합니다. 일단.;Enter

예를 들어, 개발 중에 내 프로그램 중 하나를 빌드하고 실행하는 방법은 다음과 같습니다.

$ ( cd .. ; make install ) && ./start_my_program

최상위 소스 디렉토리 아래에있는 설치 디렉토리에서이 작업을 수행합니다. cd하위 셸에서, 빌드 및 설치 부분 을 래핑 하여이 프로세스 중에 어떤 일이 발생하더라도 아무런 변화없이 정상적인 쉘로 돌아갑니다. 성공하면 (&&) 빌드되고 설치된 프로그램을 시작합니다. 나는 Ctrl-R그때 내 역사에서 이것을 한 번만 sta찾을 수 있습니다.

이것을 사용하는 또 다른 예는 동일한 프로그램의 RPM을 구축하는 순서입니다. 지루한 작업의 대부분은 셸 스크립트에 있지만 Bash가 유지하기 때문에 빌드 된 RPM을 빌드하고 배포하는 모든 작업을 수행하기 위해 일반적으로 입력 해야하는 명령이 여전히 있습니다. 나를 위해 역사에서.

모든이를 결합 export HISTSIZE=bignum하고 shopt histappend당신은 단지 코끼리의 명령 메모리를 구축했다.

나는 한 번에 최대 코딩 또 다른 해결책은에 내 대답여기에 또 다른 질문 . cd히스토리 검색 옵션은 모든 목적과 모든 명령에 대해 작동하는 반면, 목적에 맞게 조정해야 할 수도 있으며 명령 만 처리 합니다.


답변

나는 alias자주 방문하는 긴 경로를 단축하는 데 사용 합니다. 에 aliases 세트를 넣을 수 bashrc있으므로 bash는 로그인 할 때마다 기억할 수 있습니다. 그리고 bash는 자동 완성에 별칭을 추가합니다.

나는 당신의 경우를 위해 이와 같은 것을 쓸 것입니다 : alias go-classes="cd ~/repo/www/public/util/classes"


답변

bashmarks (github에서)를 찾고있을 수 있습니다 .
읽어보기에서 :

Bashmarks는 일반적으로 사용되는 디렉토리를 저장하고 이동할 수있는 쉘 스크립트입니다. 이제 탭 완성을 지원합니다.


답변

이것은 완전하지도 않고 어리석지도 않으며 단지 초안 일뿐입니다. 다음 ~/.bashrc을 추가하면 삭제 및 목록 디렉토리 북마크를 추가하는 세 가지 명령이 있습니다 (쉘 별명을 기반으로하므로 자동 완성도 가능합니다).

BMFILE=~/.bash.bookmarks
[ -f "$BMFILE" ] && . "$BMFILE"

bmadd() {
    local abm
    if [[ $# = 0 ]]; then
        bm=$(basename $(pwd))
    else
        bm=$1
    fi

    abm="alias $bm='cd \"$(pwd)\"'"

    if grep -q " $bm=" "$BMFILE"; then
        echo "Overwriting existing bookmark $bm"
        bmdel "$bm"
    fi
    echo "$abm" >> "$BMFILE"
    eval "$abm"
    #source "$BMFILE"
}

bmdel() {
    local bms
    if [[ $# = 0 ]]; then
        bm=$(basename $(pwd))
    else
        bm=$1
    fi

    #sed -i.bak "/ $bm=/d" "$BMFILE"
    bms=$(grep -v " $bm=" "$BMFILE")
    echo "$bms" > "$BMFILE"
    unalias "$bm" 2> /dev/null
}

bmlist() {
    sed 's/alias \(.*\)=.cd "\(.*\)".$/\1\t\2/' "$BMFILE" | sort
}

사용법은 매우 간단합니다. bmadd인수를 사용하면 인수 뒤에 이름이 지정된 별명이 추가됩니다. 이 별명은 설정 한 디렉토리로 cd를 만듭니다. 인수 없이는 현재 dirname을 별명 이름으로 사용합니다. 비슷한 방법으로, bmdel존재하는 경우 별명을 삭제하고 bmlist현재 책갈피를 나열합니다.

예 :

u@h:~ $ cd /usr/share/doc
u@h:/usr/share/doc $ bmadd
u@h:/usr/share/doc $ cd /usr/local/share/
u@h:/usr/local/share $ bmadd lshare
u@h:/usr/local/share $ cd
u@h:~ $ bmlist
doc     /usr/share/doc
lshare  /usr/local/share
u@h:~ $ doc
u@h:/usr/share/doc $ bmdel lshare
u@h:/usr/share/doc $ bmlist
doc     /usr/share/doc
u@h:/usr/share/doc $