태그 보관물: shell-script

shell-script

시스템 관리를 위해 여러 디렉토리 사이를 전환하는 빠른 명령 행 방법은 무엇입니까? .하고 popd토글 할 수 있지만, 배수를

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



답변

사용 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/

답변

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

답변

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

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


답변

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

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

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

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

답변

나는 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를 입력하면 게임에서 두 방 사이를 전환하여 기분을 피할 수 있습니다.


답변

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.

답변

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이 갈 수있는 항목의 인덱스입니다).