시스템 관리를 위해 여러 디렉토리 사이를 전환하는 빠른 명령 행 방법은 무엇입니까?


46

시스템 관리를 위해 여러 디렉토리 사이를 전환하는 빠른 명령 행 방법은 무엇입니까? 나는 사용 pushd .하고 popd토글 할 수 있지만, 배수를 저장하고 스택 맨 아래에서 영구적으로 터뜨리지 않고 순환하려면 어떻게해야합니까?


$CDPATH혹시?
roaima

6
오 마이-나는 cd -이 질문에서 인터넷 검색 후 방금 배웠습니다 .
Nacht-복원 모니카

@ Nacht : 파일 구조를 어떻게 탐색 했습니까?
loneboat

1
cd손으로 어디서나 했어 . 아 ful어요 그러나 탭 키로 자동 완성을 사용했습니다.
Volomike

1
어쩌면 당신은 za를 시도 하고 싶을 수도 있습니다 . 동일한 두 쌍의 디너 내에서 많이 뛰어 다니는 데 매우 편리합니다.
Rolf

답변:


28

사용 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 ~-.

의 장점 ~-이상은 --에 고유 한 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/

1
사용 가능cd -
Volomike

cd -앞뒤로 같은 역할을 DROP DUP예를 들어, 만약 디렉토리에 하나의 시작 , 스택과 ABCD 하는가 에 스택 변경 bbcd을 . 그러나 스택이 abcd로 다시 변경 되기 때문에 아마도 버그 일 것입니다 . 이것으로부터 스택을 변경하는 것 외에도 별도의 데이터 구조를 사용하여 이전 디렉토리를 저장하는 것을 유추 할 수 있습니다 . cd -bashcd -cd -
agc

3
@agc, cd -용도 $OLDPWD및 그 밖의 것은 없습니다.
와일드 카드

아마도 cd -초기 배쉬 기능 이었을 수도 있고 나중에 스택을 추가했지만 더 단순한 디자인을 원했던 것보다 오래된 코드를 깨뜨리는 것을 두려워했습니다. 이전에 수정이 cd -앞뒤로 같은 것을 역할 OLDPWD @ SWAP OLDPWD ! DUP . 달리 cd foocd -인쇄합니다 교환 된 디렉토리의 이름.
agc

또는 항상 대화 형 푸시 래퍼가 있습니다 (다른 질문에는 autojump 등이 포함됩니다).
쓸모없는

42

bash및 옵션이 내장 pushd되어 디렉토리 스택을 회전시킬 수 있습니다. 스택이 0부터 시작하는 배열 이기 때문에 구문이 약간 혼동 될 수 있습니다 . 이 간단한 래퍼 함수는 디렉토리 스택을 순환합니다.+-

# 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

스택에서 다음 디렉토리로 네 번 변경하고 표시하십시오.

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 -을 사용하지 않는 $의 DIRSTACK의 (가 사용, 배열을 $ OLDPW 그 때문에, 변수) cd -에 영향을주지 않습니다 DIRSTACK $를 스택 기반 스왑해야하는 방법을. 이를 수정하기 위해 간단한 $ DIRSTACK 기반 스왑 기능이 있습니다.

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

내 좌절은 스택에 항목을 넣고 스택을 지울 때까지 보관하고 싶다는 것입니다. 그렇게하면 필요에 따라 3 개의 디어 각각을 푸시, 푸시, 푸시 및 순환 할 수 있습니다. 예를 들어 세 개의 디렉토리가 마치 브라우저 탭과 같은 것처럼 뒤집고 탭을 닫을 때까지 앞뒤로 이동해야한다고 가정 해보십시오. 이것은 명령 줄 방식으로 이것을 해결합니까?
Volomike

5
네, 믿습니다. 사용해보십시오. 상단 항목을 제거하려면, popd변경 사항을 변경하지 않고 제거 하려면을 수행하십시오 popd -n. 스택을 지우려면 수행하십시오 dirs -c. bash 설계자가 그러한 유용한 기능을 직관적이지 않은 구문으로 묻었을 때 너무 나쁩니다 . man bash아래 pushddirs, 등 참조
agc

공장! 그리고 문서에서 진흙처럼 분명했습니다. 나는 그 기술을 알고 있기 때문에 단순함을 좋아한다.
Volomike

13

fasd 를 설치하는 것이 좋습니다 . 이름의 일부만 입력하면 이미있는 디렉토리로 빠르게 이동할 수 있습니다.

예 : 방문한 경우 예 를 들어 /home/someName/scripts/입력 z scr하면 바로 이동할 수 있습니다. 히스토리 스택 또는 이와 유사한 항목의 순서를 기억하는 것이 더 편리합니다.


10

이 때 cd어딘가에, 배쉬 이전 작업 디렉토리를 환경 변수를 저장한다 $OLDPWD.

당신과 그 디렉토리로 다시 전환 할 수 있습니다 cd -동일합니다, cd "$OLDPWD".

다음과 같이 디렉토리 간을 바운스 할 수 있습니다.

blue$ cd ~/green
green$ cd -
blue$ cd -
green$

6

나는 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

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

xyzzy는 Collosal Cave 텍스트 어드벤처에 대한 참조입니다. xyzzy를 입력하면 게임에서 두 방 사이를 전환하여 기분을 피할 수 있습니다.


2
+1 나는 이것을 가지고 놀기 시작했다. 훌륭하지만 아직 디렉토리가 추가되지 않고 xyzzy 만 입력하면 실패하는 것 같습니다. cyclenext ()에서 MAXLINES -eq 0에 대한 테스트가 하나 더 필요합니다.
Joe

5

z [link] 라는 작은 스크립트를 사용하는데 , 요청한대로 정확하게 수행하지 않아도 관심이있을 수 있습니다.

NAME
       z - jump around

SYNOPSIS
       z [-chlrtx] [regex1 regex2 ... regexn]

AVAILABILITY
       bash, zsh

DESCRIPTION
       Tracks your most used directories, based on 'frecency'.

       After  a  short  learning  phase, z will take you to the most 'frecent'
       directory that matches ALL of the regexes given on the command line, in
       order.

       For example, z foo bar would match /foo/bar but not /bar/foo.

어쩌면 내가 뭔가를 놓쳤지만 z 스크립트 자체는 어디에서 찾을 수 있습니까?
Joe

죄송합니다. 링크가 z에있었습니다. 보다 쉽게 ​​볼 수 있도록 편집합니다.
Graipher

5

cd_funcPetar Marinov 도 있으며 기본적으로 cd최대 10 개의 항목이 있습니다. http://linuxgazette.net/109/misc/marinov/acd_func.html

# do ". acd_func.sh"
# acd_func 1.0.5, 10-nov-2004
# petar marinov, http:/geocities.com/h2428, this is public domain

cd_func ()
{
  local x2 the_new_dir adir index
  local -i cnt

  if [[ $1 ==  "--" ]]; then
    dirs -v
    return 0
  fi

  the_new_dir=$1
  [[ -z $1 ]] && the_new_dir=$HOME

  if [[ ${the_new_dir:0:1} == '-' ]]; then
    #
    # Extract dir N from dirs
    index=${the_new_dir:1}
    [[ -z $index ]] && index=1
    adir=$(dirs +$index)
    [[ -z $adir ]] && return 1
    the_new_dir=$adir
  fi

  #
  # '~' has to be substituted by ${HOME}
  [[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}"

  #
  # Now change to the new dir and add to the top of the stack
  pushd "${the_new_dir}" > /dev/null
  [[ $? -ne 0 ]] && return 1
  the_new_dir=$(pwd)

  #
  # Trim down everything beyond 11th entry
  popd -n +11 2>/dev/null 1>/dev/null

  #
  # Remove any other occurence of this dir, skipping the top of the stack
  for ((cnt=1; cnt <= 10; cnt++)); do
    x2=$(dirs +${cnt} 2>/dev/null)
    [[ $? -ne 0 ]] && return 0
    [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
    if [[ "${x2}" == "${the_new_dir}" ]]; then
      popd -n +$cnt 2>/dev/null 1>/dev/null
      cnt=cnt-1
    fi
  done

  return 0
}

alias cd=cd_func

if [[ $BASH_VERSION > "2.05a" ]]; then
  # ctrl+w shows the menu
  bind -x "\"\C-w\":cd_func -- ;"
fi

Siimply 사용은 cd --당신이 10 디렉토리에 과거 최대의 목록을 보여 cd에드와 cd -N( N이 갈 수있는 항목의 인덱스입니다).


4

나는 주로 oh-my-zsh 프로파일 과 함께 ZSH를 사용 합니다. 다음과 일치하는 터미널을 입력 할 수 있습니다.

# cd /ho

그런 다음 화살표 (위와 아래)를 사용하여 위의 문자로 시작하는 항목 만 표시하는 모든 쉘 기록을 살펴볼 수 있습니다. 예를 들어 /home/morfik/Desktop//home/morfik/something/로 이동하면 디렉토리간에 매우 빠르게 전환 할 수 있습니다. 쉘 히스토리에 몇 개의 항목이 있는지는 중요하지 않지만, 많은 것이있을 때 더 나은 표현을 사용 cd /home/morf하십시오. 즉 키보드의 위 / 아래 화살표를 누르십시오.

솔루션을 달성하는 또 다른 방법도 있습니다. 이 경우 tmuxFZF 를 사용해야 합니다. 그런 다음 바로 가기 키 (예 : ctrl-r)를 작성하면이 키를 누르면 현재 창이 분할되어 다음과 같이 표시됩니다.

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

이제 표현식을 사용하여 목록을 검색 할 수 있습니다. 방금 입력 ^cd /media하여 문구로 시작하는 항목 만 반환합니다. 물론 'cd 'home명령과 경로 이름이 아닌 전체 디렉토리 이름과 일치하도록 입력 하면됩니다.

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


4

당신은 ~/.bashrc(또는 동등한) 에 많은 별칭으로 이것을 달성 할 수 있습니다

주요 목표는 d5풀에서 디렉토리 사이를 전환하기 위해 거의 최소 타이핑 (예 : 풀의 디렉토리 번호 5로 이동)입니다. 또한 풀에서 / 풀에서 디렉토리를 쉽게 추가 / 제거 할 수 있기를 원합니다.

alias pd=pushd
alias po=popd
alias d='dirs -v'
alias d0=d
alias d1='pd +1'
alias d2='pd +2'
alias d3='pd +3'
alias d4='pd +4'
alias d5='pd +5'
alias d6='pd +6'
alias d7='pd +7'
alias d8='pd +8'
alias d9='pd +9'
alias d10='pd +10'
# -- feel free to add more aliases if your typical dir pool is larger than 10

이제 스택의 디렉토리를 푸시 할 때마다 위치 0 (현재 디렉토리)의 번호가 매겨진 풀에 추가되고 매우 작은 타이핑 ( d<N>)을 사용하여 디렉토리를 전환 할 수 있으며 모든 번호가 지정된 풀을 볼 수 있습니다 을 입력하면됩니다 d.

이 별명을 사용하는 몇 가지 예 :

번호가 지정된 디렉토리 풀을 표시합니다 (현재 디렉토리는 # 0 임).

$ d
 0  /tmp
 1  /
 2  /usr

디렉토리 간 전환 : 사용 d<N>

$ d2
$ pwd
/usr

풀에 새 디렉토리 추가

$ pd /var/log
$ d
 0  /var/log
 1  /usr
 2  /tmp
 3  /

좀 더 뛰어 다니십시오.

$ d3
$ pwd
/

$ d3
$ pwd
/tmp

$ d
 0  /tmp
 1  /
 2  /var/log
 3  /usr

풀에서 최상위 (현재) 디렉토리 제거 / 팝

$ po
$ d
 0  /
 1  /var/log
 2  /usr

2

iselect를 설치 한 경우 다음과 같이 할 수 있습니다.

$ alias dirselect='cd $(iselect -a $(dirs -l -p | sort -u))'
$ dirselect

그러면 디렉토리를 선택할 수있는 전체 화면 ncurses 기반 대화식 화살표 키 탐색 메뉴가 제공 cd됩니다.

pushd현재 셸 세션에서 사용하지 않은 경우 메뉴의 디렉토리 목록은 현재 디렉토리 하나만 시작합니다. 항목이 하나 뿐인 경우이 dirselect별명은 cd메뉴 화면없이 항목에 영향을 미치 므로 효과적으로 아무 것도 cd -수행 하지 않습니다 ( 유용한 작업을 수행 하지 못하도록 제외 )

목록에 새 디렉토리를 추가하려면 다음을 사용하십시오 pushd dir(또는 동시에 -ing pushd -n dir하지 않고 디렉토리 추가 cd).

또는 pushd에서 다음과 같은 작업을 수행 하여 스택을 미리 채울 수 있습니다 ..bashrc~/.bash_profile

for d in /var/tmp /tmp /path/to/somewhere/interesting ; do 
  pushd -n "$d" > /dev/null
done

popd또는로 항목을 제거 할 수 있습니다 popd -n.

자세한 내용 help pushdhelp popd, 및 help dirsbash를 참조하십시오. 그리고 물론 man iselect.

BTW iselect는 아마도 배포판에 사전 패키지되어 제공 될 수 있습니다. 데비안과 우분투 등을위한 것이며 아마도 다른 사람들을위한 것일 수도 있습니다.



2

작업 디렉토리를 빠르게 변경하기 위해 jump 를 사용 하고 있습니다.

현재 디렉토리를 추가하려면

jump -a [bookmark-name]

모든 북마크를 나열하려면

jump -l

예 :

------------------------------------------------------------------
 Bookmark    Path                                                 
------------------------------------------------------------------
 reports     ~/mydir/documents/reports
 projects    ~/documents/projects
 dl          ~/Downloads                     
------------------------------------------------------------------

이제 다른 디렉토리로 쉽게 이동할 수 있습니다.

jump reports

bash 및 zsh에 대한 자동 완성을 지원합니다.


편집 (@Joe에 대한 응답) : 바이너리 jump-bin는에 저장되고 /usr/local/binbash 통합 스크립트 (내 PC에 있음 /var/lib/gems/1.9.1/gems/jump-0.4.1/bash_integration/shell_driver)를 사용하여을 jump호출 하는 bash 함수 를 만듭니다 jump-bin.


점프 명령은 어디에 있습니까? 나는 그것을 가지고 있지 않으며 그것을 어디서 얻을 수 있는지 즉시 보지 못한다.
Joe

2

alias탐색 하는 데 사용합니다. 자주 액세스하는 디렉토리가 적 으면 별명을 설정하십시오. 예를 들어

alias e='cd /etc'
alias h='cd /home'
alias al='cd /var/log/apache2/'

그런 다음 간단히

e 

당신을 데려 갈 것 /etc입니다.

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