저는 함께 일하는 많은 사람들과 마찬가지로 Magento에서 많은 작업을 수행하고 있으며 다음과 같이 입력해야 한다는 것은 짜증나는 일입니다.
CD../../../../../../
루트 "httpdocs" 폴더에서 몇 개의 디렉터리만 검색하기 위해 다음 의사 코드를 따르는 스크립트를 만들어 보았습니다.
while lowest level directory != httpdocs
cd ../
end while;
간단해 보입니다. 현재 작업 디렉토리의 마지막 부분이 httpdocs인지 확인하기 위해 grep을 수행해야 하고, 그렇지 않은 경우 true가 될 때까지 한 수준 위로 계속해야 한다고 가정합니다.
나는 이것을 위해 bash를 배우는 것에 대해 생각하고 있습니다. 이미 비슷한 것이 있는 것 같고 구문이 나를 끝없이 혼란스럽게 합니다.
답변1
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] $
답변2
이건 틀림없어쉘 기능, 스크립트가 아닌 새 쉘에서 스크립트가 실행되기 때문입니다(따라서 원래 쉘의 디렉토리는 변경할 수 없습니다).
function cdroot()
{
while [[ $PWD != '/' && ${PWD##*/} != 'httpdocs' ]]; do cd ..; done
}
물론 함수 이름은 원하는 대로 지정할 수 있습니다.
몇 가지 설명: 첫 번째 테스트( )는 httpdocs 폴더 내부가 아닐 때 테스트하는 $PWD != '/'
경우 안전 장치입니다 . cdroot
루트에 도달하면 중지됩니다.
두 번째 테스트( ${PWD##*/} != 'httpdocs'
)는 좀 더 복잡합니다. $PWD
현재 디렉터리의 경로를 포함하는 변수입니다.${PWD##*/}
마지막 슬래시까지 모든 것을 다듬습니다.
답변3
내가 생각할 수 있는 가장 간단한 bash 함수 .bashrc
는 다음과 같습니다(루프나 외부 프로세스를 사용하지 않기 때문에 간단함).
cdup() {
cd "${PWD/\/httpdocs\/*//httpdocs}"
}
이는 다음을 사용합니다.패턴 교체/httpdocs/
매개변수 확장은 이후의 모든 내용을 $PWD
"/httpdocs"로 대체합니다. bash 확장 구문의 슬래시와 구별하기 위해 경로에서 슬래시를 이스케이프해야 하기 때문에 매우 혼란스러워 보입니다. 또한 대체 문자열에서 슬래시를 이스케이프하지 마십시오. 그러면 일관성이 없어 보입니다.
현재 경로에 없으면 /httpdocs/
교체가 수행되지 않고 현재 디렉터리만 변경됩니다.
예를 들어, 교체는 해당 디렉토리로 /a/b/c/httpdocs/e/f/g
대체 /a/b/c/httpdocs
됩니다 .cd
이 함수는 하위 프로세스가 상위 프로세스의 현재 디렉터리를 변경할 수 없기 때문에 현재 쉘 환경에(함수 또는 별칭으로) 있어야 합니다. 그렇기 때문에 .bashrc
쉘 스크립트가 아닌 스크립트에 넣으라고 말한 것입니다 .
답변4
문제가 완전히 해결되지는 않지만 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
}