시스템 관리를 위해 여러 디렉토리 사이를 전환하는 빠른 명령 행 방법은 무엇입니까? 나는 사용 pushd .
하고 popd
토글 할 수 있지만, 배수를 저장하고 스택 맨 아래에서 영구적으로 터뜨리지 않고 순환하려면 어떻게해야합니까?
cd -
이 질문에서 인터넷 검색 후 방금 배웠습니다 .
cd
손으로 어디서나 했어 . 아 ful어요 그러나 탭 키로 자동 완성을 사용했습니다.
시스템 관리를 위해 여러 디렉토리 사이를 전환하는 빠른 명령 행 방법은 무엇입니까? 나는 사용 pushd .
하고 popd
토글 할 수 있지만, 배수를 저장하고 스택 맨 아래에서 영구적으로 터뜨리지 않고 순환하려면 어떻게해야합니까?
cd -
이 질문에서 인터넷 검색 후 방금 배웠습니다 .
cd
손으로 어디서나 했어 . 아 ful어요 그러나 탭 키로 자동 완성을 사용했습니다.
답변:
사용 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/
cd -
cd -
앞뒤로 같은 역할을 DROP DUP
예를 들어, 만약 디렉토리에 하나의 시작 , 스택과 ABCD 하는가 에 스택 변경 bbcd을 . 그러나 스택이 abcd로 다시 변경 되기 때문에 아마도 버그 일 것입니다 . 이것으로부터 스택을 변경하는 것 외에도 별도의 데이터 구조를 사용하여 이전 디렉토리를 저장하는 것을 유추 할 수 있습니다 . cd -
bash
cd -
cd -
cd -
용도 $OLDPWD
및 그 밖의 것은 없습니다.
cd -
초기 배쉬 기능 이었을 수도 있고 나중에 스택을 추가했지만 더 단순한 디자인을 원했던 것보다 오래된 코드를 깨뜨리는 것을 두려워했습니다. 이전에 수정이 cd -
앞뒤로 같은 것을 역할 OLDPWD @ SWAP OLDPWD ! DUP .
달리 cd foo
의 cd -
인쇄합니다 교환 된 디렉토리의 이름.
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
popd
변경 사항을 변경하지 않고 제거 하려면을 수행하십시오 popd -n
. 스택을 지우려면 수행하십시오 dirs -c
. bash 설계자가 그러한 유용한 기능을 직관적이지 않은 구문으로 묻었을 때 너무 나쁩니다 . man bash
아래 pushd
의 dirs
, 등 참조
나는 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
이 갈 수있는 항목의 인덱스입니다).
나는 주로 oh-my-zsh 프로파일 과 함께 ZSH를 사용 합니다. 다음과 일치하는 터미널을 입력 할 수 있습니다.
# cd /ho
그런 다음 화살표 (위와 아래)를 사용하여 위의 문자로 시작하는 항목 만 표시하는 모든 쉘 기록을 살펴볼 수 있습니다. 예를 들어 /home/morfik/Desktop/
및 /home/morfik/something/
로 이동하면 디렉토리간에 매우 빠르게 전환 할 수 있습니다. 쉘 히스토리에 몇 개의 항목이 있는지는 중요하지 않지만, 많은 것이있을 때 더 나은 표현을 사용 cd /home/morf
하십시오. 즉 키보드의 위 / 아래 화살표를 누르십시오.
솔루션을 달성하는 또 다른 방법도 있습니다. 이 경우 tmux 및 FZF 를 사용해야 합니다. 그런 다음 바로 가기 키 (예 : ctrl-r)를 작성하면이 키를 누르면 현재 창이 분할되어 다음과 같이 표시됩니다.
이제 표현식을 사용하여 목록을 검색 할 수 있습니다. 방금 입력 ^cd /media
하여 문구로 시작하는 항목 만 반환합니다. 물론 'cd 'home
명령과 경로 이름이 아닌 전체 디렉토리 이름과 일치하도록 입력 하면됩니다.
~/.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
.
이 별명을 사용하는 몇 가지 예 :
$ 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
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 pushd
은 help popd
, 및 help dirs
bash를 참조하십시오. 그리고 물론 man iselect
.
BTW iselect
는 아마도 배포판에 사전 패키지되어 제공 될 수 있습니다. 데비안과 우분투 등을위한 것이며 아마도 다른 사람들을위한 것일 수도 있습니다.
5 개 또는 10 개의 디렉토리가 있고 많이 사용하고 최근에 사용한 5 개 또는 10 개의 디렉토리를 신경 쓰지 않아도되는 경우 와 같은 일부 명령 별명을 설정하십시오.
alias cdw="cd /var/www/html"
그리고 아파치 홈 페이지 디렉토리로 가고 싶을 때 상징적 링크에 대한 별칭cdw
과 동일하게 대답 했습니까? .
작업 디렉토리를 빠르게 변경하기 위해 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/bin
bash 통합 스크립트 (내 PC에 있음 /var/lib/gems/1.9.1/gems/jump-0.4.1/bash_integration/shell_driver
)를 사용하여을 jump
호출 하는 bash 함수 를 만듭니다 jump-bin
.
$CDPATH
혹시?