시스템 관리를 위해 여러 디렉토리 사이를 전환하는 빠른 명령 행 방법은 무엇입니까? 나는 사용 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_func
Petar 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
이 갈 수있는 항목의 인덱스입니다).