나는 마 젠토에서 많은 일을하고, 함께 일하는 많은 사람들도 일을하며, 타이핑을하는 것은 귀찮아진다 :
cd ../../../../../../
루트 ‘httpdocs’폴더에서 여전히 몇 개의 디렉토리를 찾기 위해이 의사 코드를 따르는 스크립트를 만들려고합니다.
while lowest level directory != httpdocs
cd ../
end while;
꽤 단순 해 보입니다. 현재 작업 디렉토리의 마지막 부분이 httpdocs인지 확인하기 위해 일종의 grep을 수행해야한다고 가정하고 있습니다.
나는 이것에 대해 bash를 배우고 있었지만 이미 비슷한 것이있을 것 같지만 구문은 나를 끝내지 못한다.
답변
스크립트는 새 쉘에서 실행되므로 원래 쉘의 디렉토리를 변경할 수 없으므로 스크립트가 아닌 쉘 함수 여야합니다 .
function cdroot()
{
while [[ $PWD != '/' && ${PWD##*/} != 'httpdocs' ]]; do cd ..; done
}
물론 원하는대로 함수의 이름을 지정할 수 있습니다.
몇 가지 설명 : 첫 번째 테스트 ( $PWD != '/'
)는 cdroot
httpdocs 폴더 안에 있지 않은 경우를 대비 한 안전 장치입니다 . 루트에 도착하면 멈출 것입니다.
두 번째 테스트 ( ${PWD##*/} != 'httpdocs'
)는 조금 더 복잡합니다. $PWD
현재 디렉토리의 경로를 포함하는 변수입니다. ${PWD##*/}
마지막 슬래시를 포함하여 모든 것을 잘라냅니다.
답변
upto
내 .bashrc에 호출 된 함수가있어 이름으로 현재 경로의 모든 디렉토리로 이동할 수 있습니다.
upto ()
{
if [ -z "$1" ]; then
return
fi
local upto=$1
cd "${PWD/\/$upto\/*//$upto}"
}
또한이 기능을 완료 했으므로 탭을 눌렀을 때 유효한 디렉토리 이름과 완성을 제공합니다.
_upto()
{
local cur=${COMP_WORDS[COMP_CWORD]}
local d=${PWD//\//\ }
COMPREPLY=( $( compgen -W "$d" -- "$cur" ) )
}
complete -F _upto upto
또한 jd
현재 디렉토리 아래의 디렉토리로 이동할 수 있는 다른 기능 이 있습니다.
jd(){
if [ -z "$1" ]; then
echo "Usage: jd [directory]";
return 1
else
cd **"/$1"
fi
}
예:
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto h[TAB][TAB]
habitat hippopotamus
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto hippopotamus
[/www/public_html/animals/hippopotamus] $ jd images
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $
답변
.bashrc
내가 생각할 수있는 가장 간단한 bash 함수는 다음 과 같습니다 (루프 또는 외부 프로세스를 사용하지 않기 때문에 간단합니다).
cdup() {
cd "${PWD/\/httpdocs\/*//httpdocs}"
}
이는 사용 패턴 대체 한 후 모든 것을 대체 할 매개 변수 확장을 /httpdocs/
에 $PWD
`/ httpdocs ‘로. bash 확장 구문에서 슬래시와 구분하기 위해 경로에서 슬래시를 이스케이프해야하기 때문에 매우 혼란스럽게 보입니다. 또한 교체 문자열에서 슬래시를 이스케이프 처리하지 않으므로 일관성이 없어 보입니다.
더있는 경우 /httpdocs/
현재 경로에 다음에는 대체가 수행되지 않으며 단지 현재 디렉토리로 변경됩니다.
예를 들어, 대체 대체 할 /a/b/c/httpdocs/e/f/g
로 /a/b/c/httpdocs
하고 cd
그 디렉토리에.
하위 프로세스는 상위 프로세스의 상위 디렉토리를 변경할 수 없으므로 함수는 현재 쉘 환경 (함수 또는 별명)에 있어야합니다. 이것이 내가 .bashrc
쉘 스크립트가 아닌 귀하의 스크립트에 넣는 이유 입니다.
답변
프로필에 다음과 같은 것을 넣을 수도 있습니다.
alias cdh='cd $(echo $PWD | sed -e "s/\(.*\/httpdocs\)\/.*/\1/")'
입력 만하면 현재 경로 cdh
의 최상위 httpdocs
디렉토리로 이동합니다.
답변
문제를 완전히 해결하지는 못하지만 cd ../../../../../../
약간의 비용을 절약 할 수 있습니다. 나는에서이 문제를 차용 한 사용자 불명 의 포스트 여기 .
N까지
디렉토리 트리에서 N 디렉토리 위로 이동
입력하는 대신
cd ../../../..
당신은 입력
up 4
그리고
cd -
당신을 다시 가져올 것이다
함수를 .bashrc에 넣어 사용하십시오.
# (c) 2007 stefan w. GPLv3
function up {
ups=""
for i in $(seq 1 $1)
do
ups=$ups"../"
done
cd $ups
}