시스템에서 관리하는 여러 디렉터리 간에 전환하는 빠른 명령줄 방법은 무엇입니까?

시스템에서 관리하는 여러 디렉터리 간에 전환하는 빠른 명령줄 방법은 무엇입니까?

시스템에서 관리하는 여러 디렉터리 간에 전환하는 빠른 명령줄 방법은 무엇입니까? 내 말은, pushd .and 를 사용하여 popd전환할 수 있지만 스택 맨 아래에서 영구적으로 꺼내는 대신 여러 개를 저장하고 반복하려면 어떻게 해야 할까요?

답변1

bashpushd에 내장+그리고-옵션은 디렉터리 스택을 회전할 수 있습니다. 구문은 다소 혼란스러울 수 있습니다. 아마도 스택이 다음과 같기 때문일 것입니다.배열을 기반으로 합니다. 이러한 간단한 래퍼 함수는 디렉터리 스택을 반복합니다.

# cd to next     directory in stack (left  rotate)
ncd(){ pushd +1 > /dev/null ; }
# cd to previous directory in stack (right rotate)
pcd(){ pushd -0 > /dev/null ; }

테스트: 4개의 디렉터리 스택을 설정합니다.

dirs -c   # clear directory stack
cd /home ; pushd /etc ; pushd /bin ; pushd /tmp

지금/tmp은 현재 디렉터리이고 스택은 다음과 같습니다.

/tmp /bin /etc /home

스택의 다음 디렉터리로 4번 변경하고 표시합니다.

ncd ; pwd ; ncd ; pwd ; ncd ; pwd ; ncd ; pwd

산출:

/bin
/etc
/home
/tmp

스택의 이전 디렉터리로 4번 변경하고 표시합니다.

pcd ; pwd ; pcd ; pwd ; pcd ; pwd ; pcd ; pwd

산출:

/home
/etc
/bin
/tmp

에 대한 cd -:와일드카드답변도움말에서는 cd -사용하지 않는 방법을 설명합니다.$DISTACK배열(이것은$OLDPW변수) cd -영향을 미치지 않도록$DISTACK스택 기반 교환은 이렇게 이루어져야 합니다. 이 문제를 해결하려면 다음과 같은 간단한 방법을 사용하세요.$DISTACK-기반교환기능:

scd() { { pushd ${DIRSTACK[1]} ; popd -n +2 ; } > /dev/null ; }

시험:

dirs -c; cd /tmp; \
pushd /bin; \
pushd /etc; \
pushd /lib; \
pushd /home; \
scd; dirs; scd; dirs

산출:

/bin /tmp
/etc /bin /tmp
/lib /etc /bin /tmp
/home /lib /etc /bin /tmp
/lib /home /etc /bin /tmp
/home /lib /etc /bin /tmp

답변2

pushd그런 다음 디렉터리 스택에 있는 디렉터리의 특수 이름 ( 등) 을 사용합니다 ~1.~2

예:

tmp $ dirs -v
 0  /tmp
 1  /tmp/scripts
 2  /tmp/photos
 3  /tmp/music
 4  /tmp/pictures
tmp $ cd ~3
music $ dirs -v
 0  /tmp/music
 1  /tmp/scripts
 2  /tmp/photos
 3  /tmp/music
 4  /tmp/pictures
music $ cd ~2
photos $ cd ~4
pictures $ cd ~3
music $ cd ~1
scripts $ 

이를 사용하는 가장 효율적인 방법 pushd은 디렉토리 목록을 로드한 다음하나 더 추가해당 디렉터리는 현재 디렉터리가 되며 스택에서 디렉터리 위치에 영향을 주지 않고 정적 번호 사이를 이동할 수 있습니다.


cd -마지막으로 있었던 디렉토리로 이동 한다는 점도 주목할 가치가 있습니다 .그럴 것이다 cd ~-.

~-just보다 장점 은 에 특정 하지만 다음으로 확장된다는 -것입니다.-cd~-당신의 껍질을 통해~1~2등등 과 같습니다. 이는 매우 긴 디렉터리 경로 간에 파일을 복사할 때 유용합니다. 예를 들면 다음과 같습니다.

cd /very/long/path/to/some/directory/
cd /another/long/path/to/where/the/source/file/is/
cp myfile ~-

위의 공식은 다음과 동일합니다.

cp /another/long/path/to/where/the/source/file/is/myfile /very/long/path/to/some/directory/

답변3

설치하시는 걸 추천드려요파시스트 당원. 디렉터리 이름의 일부만 입력하면 이미 있는 디렉터리로 빠르게 이동할 수 있습니다.

예시: 방문한 경우 예시를 입력하면 /home/someName/scripts/해당 페이지로 이동합니다. z scr이는 히스토리 스택이나 이와 유사한 순서를 기억하는 것보다 훨씬 편리합니다.

답변4

xyzzy나는 이를 위해 스크립트를 작성했습니다 :

#!/bin/bash

i="$1"
i=$((${i//[^0-9]/}))
i="$(($i-1+0))"

b="$2"
b=$((${b//[^0-9]/}))
b="$(($b-1+0))"

if [ -z "$XYZZY_INDEX" ]; then
    XYZZY_INDEX="$((-1))"
fi

if [ ! -f "/tmp/xyzzy.list" ]; then
    touch /tmp/xyzzy.list
    chmod a+rw /tmp/xyzzy.list
fi
readarray -t MYLIST < /tmp/xyzzy.list

showHelp(){
read -r -d '' MYHELP <<'EOB'
xyzzy 1.0

A command for manipulating escape routes from grues. Otherwise known as a useful system admin
tool for storing current directories and cycling through them rapidly. You'll wonder why this
wasn't created many moons ago.

Usage: xyzzy [options]

help/-h/--help      Show the help.

this/-t/--this      Store the current directory in /tmp/xyzzy.list

begone/-b/--begone  Clear the /tmp/xyzzy.list file. However, succeed with a number and
            it clears just that item from the stored list.

show/-s/--show      Show the list of stored directories from /tmp/xyzzy.list

. #         Use a number to 'cd' to that directory item in the stored list. This syntax is odd:

            . xyzzy 2

            ...would change to the second directory in the list

. [no options]      Use the command alone and it cd cycles through the next item in the stored 
            list, repeating to the top when it gets to the bottom. The dot and space before xyzzy
            is required in order for the command to run in the current shell and not a subshell:

            . xyzzy

Note that you can avoid the odd dot syntax by adding this to your ~/.bashrc file:

  alias xyzzy=". xyzzy"

and then you can do "xyzzy" to cycle through directories, or "xyzzy {number}" to go to a
specific one.

May you never encounter another grue.

Copyright (c) 2016, Mike McKee <https://github.com/volomike>
EOB
    echo -e "$MYHELP\n"
}

storeThis(){
    echo -e "With a stroke of your wand, you magically created the new escape route: $PWD"
    echo "$PWD" >> /tmp/xyzzy.list
    chmod a+rw /tmp/xyzzy.list
}

begoneList(){
    if [[ "$b" == "-1" ]]; then
        echo "POOF! Your escape routes are gone. We bless your soul from the ever-present grues!"
        >/tmp/xyzzy.list
        chmod a+rw /tmp/xyzzy.list
    else
        echo -n "Waving your wand in the dark, you successfully manage to remove one of your escape routes: "
        echo "${MYLIST[${b}]}"
        >/tmp/xyzzy.list
        chmod a+rw /tmp/xyzzy.list
        for x in "${MYLIST[@]}"; do
            if [[ ! "$x" == "${MYLIST[${b}]}" ]]; then
                echo "$x" >> /tmp/xyzzy.list
            fi
        done
    fi
}

showList(){
    echo -e "These are your escape routes:\n"
    cat /tmp/xyzzy.list
}

cycleNext(){
    MAXLINES=${#MYLIST[@]}
    XYZZY_INDEX=$((XYZZY_INDEX+1))
    if [[ $XYZZY_INDEX > $(($MAXLINES - 1)) ]]; then
        XYZZY_INDEX=0
    fi
    MYLINE="${MYLIST[${XYZZY_INDEX}]}"
    cd "$MYLINE";
}

switchDir(){
    MYLINE="${MYLIST[${i}]}"
    cd "$MYLINE";
}

if [[ "$@" == "" ]];
then
    cycleNext
fi;

while [[ "$@" > 0 ]]; do case $1 in
    help) showHelp;;
    --help) showHelp;;
    -h) showHelp;;
    show) showList;;
    -s) showList;;
    --show) showList;;
    list) showList;;
    this) storeThis;;
    --this) storeThis;;
    -t) storeThis;;
    begone) begoneList;;
    --begone) begoneList;;
    *) switchDir;;
    esac; shift
done

export XYZZY_INDEX

내가 사용하는 방법은 /usr/bin폴더에 복사한 다음 chmod a+x그 위에 복사하는 것입니다. 그런 다음 ~/.bashrc맨 아래에 다음 줄을 포함하도록 루트 및 사용자 계정 파일을 편집했습니다 .

alias xyzzy='. xyzzy'
alias xy='. xyzzy'

"xy"는 명령의 축약형이며 입력 속도를 높이는 데 사용됩니다.

그런 다음 현재 디렉토리를 목록에 저장할 수 있습니다.

xyzzy this

...필요에 따라 반복합니다. 필요한 디렉토리로 이 목록을 채우면 컴퓨터를 재부팅할 때까지 해당 디렉토리가 그대로 유지됩니다. 그 이유는 /tmp가 다시 지워지기 때문입니다. 그럼 타자를 칠 수 있겠네요...

xyzzy show

...현재 저장된 디렉토리를 나열합니다. 디렉토리로 전환하려면 두 가지 옵션이 있습니다. 한 가지 옵션은 다음과 같이 인덱스(1부터 시작하는 인덱스)로 경로를 지정하는 것입니다.

xyzzy 2

...목록의 두 번째 항목 디렉터리로 전환됩니다. 또는 색인 번호를 생략하고 다음을 수행할 수 있습니다.

xyzzy

...필요에 따라 각 디렉터리를 순환하게 합니다. 실행할 수 있는 명령에 대해 자세히 알아보려면 다음을 입력하세요.

xyzzy help

물론, 내가 추가한 어리석은 echo 문으로 작업하는 것이 더 재미있습니다.

xyzzy가 정확하다는 점에 유의하세요.거대한 동굴xyzzy를 입력하면 게임 내 두 방 사이를 전환하여 문제를 피할 수 있는 텍스트 모험입니다.

관련 정보