cd에 대한 더 많은 이력이 있습니까?


답변:


31

찾고있는 명령은 pushdpopd입니다.

당신의 실제 작업 예를 볼 수 pushdpopd에서 여기를 .

mkdir /tmp/dir1
mkdir /tmp/dir2
mkdir /tmp/dir3
mkdir /tmp/dir4

cd /tmp/dir1
pushd .

cd /tmp/dir2
pushd .

cd /tmp/dir3
pushd .

cd /tmp/dir4
pushd .

dirs
/tmp/dir4 /tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1

1
$OLDPWD동일한 명령을 사용하여 두 디렉토리간에 앞뒤로 전환하려는 경우 도 있지만 쉘 특정 및 배포 / 커널 특정인지는 확실하지 않습니다.
mechalynx

4
@ivy_lynx OLDPWD는 모든 POSIX 셸에 존재하지만이 질문을 넘어서는 방법을 묻는이 질문에는 쓸모가 없습니다 (이미 질문은 이미 cd -지름길입니다 cd "$OLDPWD").
Gilles 'SO- 악마 그만'

2
cd /tmp/dir1; pushd . 그냥 대신 사용하는 이유가 pushd /tmp/dir1있습니까?
GnP

@gnp, 특별한 이유가 없습니다. 그것은 답변에서 언급 한 링크에서 가져온 것입니다. pushd /tmp/dir1잘 작동합니다.
Ramesh

1
좋아, 방금 내 호기심을 골랐어 디렉토리 트리를 앞뒤로 사용 pushd하고 실제 예제를 사용하여 답변을 향상 시키도록 제안하고 싶습니다 popd. 당신의 대답은 이미 정답입니다.
GnP

53

사용중인 쉘을 지정하지 않았으므로 zsh를 광고 할 수 있습니다.

예, 우리는 더 많은 역사를 가지고 할 cdcd -2, cd -4등이 매우 편리합니다 cd -TAB, 특히 완료 시스템 및 색상을 사용할 수 :

이것이 내가 .zshrc에있는 것입니다.

setopt AUTO_PUSHD                  # pushes the old directory onto the stack
setopt PUSHD_MINUS                 # exchange the meanings of '+' and '-'
setopt CDABLE_VARS                 # expand the expression (allows 'cd -2/tmp')
autoload -U compinit && compinit   # load + start completion
zstyle ':completion:*:directory-stack' list-colors '=(#b) #([0-9]#)*( *)==95=38;5;12'

그리고 결과 :

여기에 이미지 설명을 입력하십시오


4
bash bash bash bash
Tim

7
좋아, 나는이 답변을 삭제하지 않을 것입니다. 아마도 다른 사람들에게 유용 할 것입니다.
jimmij

23
질문에 대해 특별히 묻지 않는 bash한 유효한 답변입니다. 제거하지 마십시오.
liori

OP가 bash 만 포함하도록 질문을 편집하는 경우이 답변은 여전히 ​​유효합니까?
Ooker

3
를 제외하고 setopt AUTO_PUSHD, 주식 zsh에서 완성 된 전 방향 디렉토리 스택을 얻는 위의 설정이 필요 하지 않다는 것을 언급 할 수 있습니다 . PUSHD_MINUS반전의 의미 cd +cd -(기호의 문제)를 CDABLE_VARS디렉토리 스택에 무관하고, zstyle여기에 소정의 호출은 단순히 디렉토리 스택 완료의 출력에 착색 추가합니다. 그러나 완료 서브 시스템을로 초기화해야합니다 autoload -U compinit && compinit.
wjv

13

"더 많은 역사"에 관한 질문에 대답합니다. cd -Bash 의 기능은 "플립"할 수있는 단일 디렉토리 만 지원 하지 않습니다 . @Ramesh는 그의 대답에서 말합니다. 당신이 디렉토리의 긴 역사를 원하는 경우에 당신이 사용할 수있는 pushdpopd디렉토리를 저장하거나 이전으로 돌아갑니다.

dirs명령을 사용하여 현재 스택에있는 목록을 볼 수도 있습니다 .

이 답변에서 자세한 설명을 볼 수 있습니다. 푸시 및 팝 명령은 어떻게 사용합니까? .


귀하의 답변에서 참조를 포함 시켰습니다. 당신이 상관하지 않기를 바랍니다. :)
Ramesh

@Ramesh-아뇨.
slm

8

bash 용 dirhistory 유틸리티를 설치하고 사용할 수 있습니다 .

기본적으로 모든 쉘에서 디렉토리 변경 사항을 수집하는 데몬이며 기록을 표시하고 전환 할 디렉토리를 선택할 수있는 Cdk 프로그램입니다 (따라서 스택에만 국한되지 않음).


7

당신은 당신이 원하는만큼 많은 역사를 가지고 있습니다 :

cd() {
[ "$((${DIRSTACKMAX##*[!0-9]*}0/10))" -gt 0 ] &&
        set -- "$@" "$DIRSTACK"               &&
        DIRSTACK='pwd -P >&3; command cd'     ||
        { command cd "$@"; return; }
_q()    while   case "$1" in (*\'*) :   ;;      (*)
                ! DIRSTACK="$DIRSTACK '$2$1'"   ;;esac
        do      set -- "${1#*\'}" "$2${1%%\'*}'\''"
        done
while   [ "$#" -gt 1 ]
do      case    ${1:---} in (-|[!-]*|-*[!0-9]*) : ;;
        (*)     eval "  set $((${1#-}+1))"' "${'"$#}\""
                eval '  set -- "$2"'" $2"'
                        set -- "${'"$1"'}" "$1"'
        ;;esac; _q "$1"; shift
done
eval "  DIRSTACK=; $DIRSTACK    &&"'
        _q "$OLDPWD"            &&
        DIRSTACK=$DIRSTACK\ $1
        set "$?" "${DIRSTACK:=$1}"'" $1
"       3>/dev/null
[ "$(($#-1))" -gt "$DIRSTACKMAX" ] &&
        DIRSTACK="${DIRSTACK% \'/*}"
unset -f _q; return "$1"
}

POSIX 호환 쉘이 zsh스타일 cd히스토리 를 제공 할 수있게하는 쉘 기능입니다 . 단일 서브 쉘을 호출하지 않고 모든 작업을 수행하며 흐름이 꽤 좋다고 생각합니다. 중간 테스트에서 모든 경우를 올바르게 처리하는 것 같습니다.

이 함수는 완전히 이식 가능한 구문에 의존하면서 환경과 마찬가지로 훌륭하게 재생하려고 시도합니다. 단 하나의 가정 만하고 $DIRSTACK환경 변수는 그 속성과 관련이 있습니다.

그것은 저장하는 모든 경로를 정규화하고 $DIRSTACK작은 따옴표로 모든 경로를 직렬화합니다. 그러나 변수의 값에 추가하기 전에 각각이 안전하게 인용되고 직렬화되도록 보장하며 어떤 종류의 특수 문자에도 문제가 없어야합니다 . $DIRSTACKMAX환경 변수가 설정 되면이 변수는 히스토리에 보유하는 경로 수의 상한으로 사용되며, 그렇지 않은 경우 한도입니다.

함수를로드하면 cd평상시와 같이 cd -[num]변경 디렉토리 히스토리를 통해 다시 추적 할 수 있습니다.

함수의 주요 메커니즘은 cd그 자체이며 ${OLD,}PWD환경 변수입니다. POSIX cd는 모든 경로 이동에 대해 이들을 변경하도록 지정 하므로 쉘의 내장 변수 만 사용하고 원하는만큼 값을 저장합니다.


@ datUser-누군가 dat가 있음을 알고 있습니다. 당신은 정말 환영합니다
mikeserv

4

acd_func.sh의 스크립트는 설명 정확히 않습니다. 기본적으로 cd함수에 과부하가 걸리고 입력 cd --하여 이전에 방문한 디렉토리의 목록을 가져 와서 번호로 선택할 수 있습니다. 더 이상 이것을 사용하지 않고 bash를 사용하는 것이 매우 어렵다는 것을 알게되었습니다. 새로운 시스템에 가장 먼저 설치했습니다.



3

다른 사람들은 이미 몇 가지 흥미로운 해결책을 다루었습니다. 얼마 전에 나는 "똑 바른 역사"를 수행하기 위해 신속하게 수정할 수있는 관련 문제에 대한 자체 솔루션을 만들었습니다. 기본적으로 자주 사용되는 디렉토리 몇 개를 "레이블"하고 모든 열린 셸에서 해당 디렉토리 를보고 재부팅 할 때까지 계속 유지하려고했습니다.

#dir_labels
#functions to load and retrieve list of dir aliases

function goto_complete {
    unset dir_labels
    declare -A dir_labels
    {
    while read line; do
        ll_pre="${line%% *}"
        ll_dir="${line#* }"
        dir_labels["$ll_pre"]="$ll_dir"
    done
    } < ~/.dir_labels
    unset ll_pre
    unset ll_dir

    local cur possib
    cur="${COMP_WORDS[COMP_CWORD]}"
    possib="${!dir_labels[@]}"
    COMPREPLY=( $(compgen -W "${possib}" -- ${cur}) )
}

complete -F goto_complete goto

function goto {
    unset dir_labels
    declare -A dir_labels
    {
    while read line; do
        ll_pre="${line%% *}"
        ll_dir="${line#* }"
        dir_labels["$ll_pre"]="$ll_dir"
    done
    } < ~/.dir_labels
    unset ll_pre
    unset ll_dir

    if [ $# -gt 0 ]; then
    key="$1"
    else
    key=default
    fi
    target="${dir_labels[$key]}"
    if [ -d "$target" ]; then
    cd "$target"
    echo "goto $key: '$target'"
    else
    echo "directory '$target' does not exist"
    fi
}

function label {
    unset dir_labels
    declare -A dir_labels
    {
    while read line; do
        ll_pre="${line%% *}"
        ll_dir="${line#* }"
        dir_labels["$ll_pre"]="$ll_dir"
    done
    } < ~/.dir_labels
    unset ll_pre
    unset ll_dir

    if [ $# -gt 0 ]; then
    target="$1"
    else
    target="default"
    fi
    dir_labels["$target"]=$PWD
    for i in "${!dir_labels[@]}"; do
    echo "$i ${dir_labels[$i]}"
    done > ~/.dir_labels
}

기본적으로 난 그냥 할 거라고 label foo현재 디렉토리를 호출 foo, 쉘 어떤에서 다음과 goto foowhould cd직접이. 빈 인수 :에 label대한 기본 대상을 만듭니다 goto.

별칭의 자동 제거를 구현하지 않았지만 여전히 약간 수정 된 형태로 사용하고 있습니다.


2

http://fex.belwue.de/fstools/bash.html 에서 "cd history"기능을 사용할 수 있습니다

그것은 당신이 있었던 모든 디렉토리를 기억하고 "cdh"와 함께 당신은 마지막 9 개의 디렉토리의 목록을 보게 될 것입니다. 번호를 입력하면이 디렉토리로 돌아갑니다.

예:

framstag @ wupp : / : cdh
1 : / usr / local / bin
2 : / var
삼: /
4 : / tmp / 135_pana / 1280
5 : / tmp / 135_pana
6 : / tmp / weihnachtsfeier
7 : / tmp
8 : / local / home / framstag
선택 : 4
framstag @ wupp : / tmp / 135_pana / 1280 :

cdh는 autocd 일명 "cd without cd"와 함께 작동합니다. cd를 입력하거나 누를 필요가 없습니다.


2

확장 된 'cd'기능을 추천하고 싶습니다.

https://github.com/dczhu/ltcd

여기에 이미지 설명을 입력하십시오

생활을보다 쉽게하기 위해 다음과 같은 기능을 제공합니다.

  • 모든 터미널 탭 / 창에서 최근에 방문한 디렉토리를 보여주는 글로벌 디렉토리 목록.
  • 현재 셸 세션에 로컬 인 로컬 디렉토리 목록.
  • 두 목록 모두 j / k (아래로 / 위로), 숫자 및 단어 검색을 사용하여 빠른 탐색을 지원합니다.
  • 글로벌 프리 점프 (예 : "cd dir"또는 "cd ar"는 / path / to / foo / bar / directory /로 이동)

흠, 유망 해 보인다. 제가 그것을 확인해 보겠습니다.
ddnomad

1

에 대한 bash는 , 기본적으로 : 대신 CD 사용을 사용하는 pushd사람들이 저장되도록 변경 directorys에 (스택 의미)

pushd /home; pushd /var; pushd log

dirs"스택 항목"의 수를 얻기 위해 스택 사용 및보다 쉬운 탐색을 보려면 다음을 사용하십시오.

dirs -v

산출:

me@myhost:/home$ dirs -v
 0  /home
 1  /var
 2  /tmp

이제이 숫자들을 다음 cd~같이 사용하십시오 :

cd ~1

그러나 이제 이러한 숫자가 재 배열되고 "0"위치가 변경되므로 다음과 pushd같이 디렉토리를 최상위 위치로 두 번 (또는 0 위치에서 더미 사용)하십시오.

me@myhost:/home$ dirs -v
 0  /home
 1  /home
 2  /var
 3  /tmp

지금 1..3은 내가 어딘가에 읽었지만 더 이상 알지 못하는 입장을 유지 합니다.

(스택에서 현재 디렉토리를 릴리스 / 히스토리 사용에서 삭제 popd)


1

312 페이지의 "쉘 프로그래밍, 4e"의 cdh 함수를 참조하십시오. 히스토리를 배열로 유지합니다.

고급 버전은 다음과 같습니다. https://drive.google.com/open?id=0B4f-lR6inxQWQ1pPZVpUQ3FSZ2M

기록을 CDHISTFILE 파일에 저장하고 문자열을 포함하는 최신 디렉토리로 변경할 수 있습니다.

cd -src

기존 cd 명령을 통해 자체적으로 설치됩니다. alias cd=_cd


1

fzf 마크 를 가능한 해결책으로 추가하고 싶었습니다 .

일단 설치되면 그것은 당신에게 명령 마크를 제공 하고 북마크 된 디렉토리를 추가하고 검색하도록 점프 합니다 (예, 그것은 완전한 기록이 아니며, 당신이 북마크 한 디렉토리 일뿐입니다).

세션 특정 동작을 푸시 / 팝했을 때의 문제, 즉 다른 bash 세션에서 동일한 스택을 갖기를 원하거나 fzf-marks에 가능합니다.


0

@ mikeserv가 제공 한 답변을 시도했지만 제대로 작동하지 않았습니다. 나는 그것을 고치는 방법을 알 수 없었기 때문에 방금 내 자신을 썼다.

cd() {
    # Set the current directory to the 0th history item
    cd_history[0]=$PWD
    if [[ $1 == -h ]]; then
        for i in ${!cd_history[@]}; do
            echo $i: "${cd_history[$i]}"
        done
        return
    elif [[ $1 =~ ^-[0-9]+ ]]; then
        builtin cd "${cd_history[${1//-}]}" || # Remove the argument's dash
        return 
    else
        builtin cd "$@" || return # Bail if cd fails
    fi
    # cd_history = ["", $OLDPWD, cd_history[1:]]
    cd_history=("" "$OLDPWD" "${cd_history[@]:1:${#cd_history[@]}}")
}

이것은 GitHub Gist 로도 제공됩니다 . 이 기능을 사용하려면 함수를 .bashrc비슷한 곳에 붙여 넣으면 마지막 cd -5다섯 번째 디렉토리 로 돌아가는 것과 같은 작업을 수행 할 수 있습니다 . cd -h이력에 대한 개요를 제공합니다.

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