단순화된 터미널 탐색

단순화된 터미널 탐색

저는 IDE가 미래의 물결이라는 것을 알고 있지만 항상 vimLinux 터미널에서 코딩하고 있습니다. 늙은 개에게는 새로운 재주가 있습니다.

어쨌든 긴 패키지 이름을 처리할 때는 탐색이 어려워집니다. 예를 들어 터미널에서 프롬프트의 일부로 현재 경로를 볼 수 있습니다. 가끔 나는 여기에 있다:

/foo/bar/src/com/example/yomama/

내가 도달하고 싶은 곳:

/foo/bar

나는 몇 가지 멋진 별칭을 가지고 있습니다:

alias 1down="cd .."
alias 2down="cd ..;cd .."
alias 3down="cd ..;cd ..;cd .."
alias 4down="cd ..;cd ..;cd ..;cd .."
alias 5down="cd ..;cd ..;cd ..;cd ..;cd .."

그래서 내가 그것을 입력하면 4down, 펑! 나는 여기 있다 /foo/bar.

내 현재 작업 디렉토리는 다음과 같습니다.

/foo/bar/src/com/example/yomama/

/up 2에서 /foo/bar에 접근할 수도 있습니다.

그래서 올라갈 금액을 계산하는 것이 더 쉽기 때문에 2up 기능을 구현하는 것이 좋을 것입니다. 이에 대한 쉘 스크립트 작성을 시작하기 전에 보다 우아한 솔루션을 제공할 수 있는 쉘 도구가 있는지 알고 싶습니다. 구현할 수 있는 문장을 아는 사람이 있으면 보너스 포인트입니다 Nup.

PS: 이미 갖고 있어요

alias bar = "cd /foo/bar"

여기서는 좀 더 일반적인 해결책을 찾고 있습니다.

$PWDPPS: 나는 항상 클릭할 수 있는 콘텐츠를 프롬프트에 추가하는 것이 정말 멋지다고 생각했습니다. 그래서 bar, cd및 을 클릭합니다 /foo/bar. 하지만 아마도 그래픽 IDE로 이동하고 종료해야 할 것 같습니다 ;-)

편집하다:

Nup에 대한 나의 정의는 약간 혼란스럽습니다.

Nup은 PWD의 루트에서 시작하는 N번째 경로 위치로 이동합니다. 따라서 현재 /a/b/c/d/e/f/g/h/i에 있다면 4up은 /a/b/c/d로 이동합니다. 마찬가지로 5down은 /a/b/c/d를 얻습니다.

기본적으로 "cd .."를 여러 번 힘들게 입력하거나 "cd /a/b/c/d"를 지정하지 않고도 경로를 탐색할 수 있습니다.

답변1

파일의 두 가지 기능을 .bashrc사용하면 디렉터리 스택을 사용하여 일부 탐색을 수행할 수 있습니다.

function down ()
{
  if [[ -z "$1" ]]
  then
   n=1
  else
   n=$1
  fi

  for ((i=0; i<$n; i++ ));
  do
      pushd .. > /dev/null
  done;
}
function up ()
{
  if [[ -z "$1" ]]
  then
   n=1
  else
   n=$1
  fi

  for ((i=0; i<$n; i++ ));
  do
      popd > /dev/null
  done;
#  dirs -c  # To clear directory on up motion
}

down N및 를 각각 사용할 수 있는 위치입니다 up N.

사용 예:

~/tmp/bash/dir1/dir2/dir3$ down 4
~/tmp$ up 2
~/tmp/bash/dir1$ up 2
~/tmp/bash/dir1/dir2/dir3$ down 2
~/tmp/bash/dir1$ down 1
~/tmp/bash$ up 3
~/tmp/bash/dir1/dir2/dir3$

물론 up N사용하기 전에는 사용할 수 없습니다 down N. 예상치 못한 일이 발생하거나 오류 메시지가 나타날 수 있습니다.

답변2

앞뒤로 이동하고 이전에 있던 디렉토리로 돌아갈 수 있는 방법은 다음과 같습니다. 이는 파일 시스템의 다른 부분을 앞뒤로 탐색할 때 특히 유용합니다(개발 중에 매우 일반적임).

지원하다:

up # (go up any # of directories)
goback 
goback # (the # is optional to go back any #)
prev (go to the last dir you were in)

또한 이를 통해 시스템의 어느 디렉터리에나 CD를 넣은 다음 이전 디렉터리로 돌아갈 수 있습니다. 이는 마지막 디렉터리의 위치를 ​​저장하기 때문입니다.

노트:이 콘텐츠의 초축약 버전을 보려면 맨 아래로 스크롤하세요.

1 단계:(nano/vim) ~/.bashrc를 편집하고 맨 아래에 다음을 추가합니다.

declare -a DIR_STACK

cd() {
    DIR_STACK+=("$PWD")
    builtin cd "$@" && pwd || { unset 'DIR_STACK[-1]'; return 1; }
}

up() {
    local count=${1:-1}
    for _ in $(seq 1 $count); do
        [[ $PWD != / ]] && DIR_STACK+=("$PWD") && builtin cd .. || { echo "Error: Reached root directory."; return 1; }
    done
    pwd
}

goback() {
    local count=${1:-1}
    while [[ ${#DIR_STACK[@]} -gt 1 && count -gt 0 ]]; do
        builtin cd "${DIR_STACK[-2]}"
        unset 'DIR_STACK[-1]' && ((count--))
    done
    [[ $count -eq 0 ]] && pwd || echo "Error: Cannot go back any further."
}

prev() {
    [[ -n $OLDPWD ]] && builtin cd - > /dev/null && pwd || echo "Error: No previous directory stored."
}

2 단계.소스 ~/.bashrc

3단계.작동 방식은 다음과 같습니다.

[root@agent colors]# pwd
/etc/xdg/colors
[root@agent colors]# cd /
/
[root@agent /]# goback
/etc/xdg/colors
[root@agent colors]# cd ..
/etc/xdg
[root@agent xdg]# goback
/etc/xdg/colors
[root@agent colors]# cd ../../
/etc
[root@agent etc]# goback
/etc/xdg/colors
[root@agent colors]# up 2
/etc
[root@agent etc]# goback
/etc/xdg/colors
[root@agent colors]# cd ..
/etc/xdg
[root@agent xdg]# prev
/etc/xdg/colors
[root@agent colors]# cd /
/
[root@agent /]# goback 3
/etc/xdg/colors
[root@agent colors]# up 3
/
[root@agent /]# goback 3
/etc/xdg/colors

.bashrc의 간단한 버전(가독성이 낮음):

declare -a DIR_STACK
cd() { DIR_STACK+=("$PWD"); builtin cd "$@" && pwd || { unset 'DIR_STACK[-1]'; return 1; }; }
up() { local count=${1:-1}; for _ in $(seq 1 $count); do [[ $PWD != / ]] && DIR_STACK+=("$PWD") && builtin cd .. || { echo "Error: Reached root directory."; return 1; }; done; pwd; }
goback() { local count=${1:-1}; while [[ ${#DIR_STACK[@]} -gt 1 && count -gt 0 ]]; do builtin cd "${DIR_STACK[-2]}"; unset 'DIR_STACK[-1]' && ((count--)); done; [[ $count -eq 0 ]] && pwd || echo "Error: Cannot go back any further."; }
prev() { [[ -n $OLDPWD ]] && builtin cd - > /dev/null && pwd || echo "Error: No previous directory stored."; }

답변3

이것은 정확히 귀하가 요청한 답변은 아니지만 다음 사항에 관심이 있을 수 있습니다.미드나잇 커맨더 파일 브라우저, 모든 Linux 배포 저장소에서 사용할 수 있어야 합니다. mc콘솔 vim과 유사한 저주를 사용하십시오. 이는 두 개의 패널로 구성된 파일 탐색 인터페이스를 제공합니다.하단에 명령 프롬프트가 있습니다;화살표 키를 사용하여 디렉토리를 탐색하고 명령을 입력할 수 있습니다(명령 기록을 탐색하려면 ctrl-n 및 ctrl-p를 사용하십시오). Ctrl-o는 인터페이스를 위아래로 전환합니다. 인터페이스가 열리면 동일한 디렉토리의 일반 하위 쉘에 있게 됩니다. 여기에서 vim을 시작할 수 있으며, EDITOR=vim환경의 옵션->구성에서 "내부 편집 사용"을 설정하고 선택을 취소하면 파일이 강조 표시된 상태에서 F4를 누르면 vim이 실행됩니다. 제가 가장 좋아하는 소프트웨어 중 하나이며 사용법을 배울 가치가 있습니다.

X 터미널에서는 인터페이스를 마우스와 함께 사용할 수 있습니다. 이를 설치한 경우 VT와 함께 마우스를 사용할 수도 있습니다 gpm.

답변4

모든 의견과 답변에 감사드립니다. 오늘 아침 국수와 함께 이런 생각이 들었습니다.

alias 1up='cd /$(echo $PWD | cut -f 2 -d /)'
alias 2up='cd /$(echo $PWD | cut -f 2,3 -d /)'
alias 3up='cd /$(echo $PWD | cut -f 2,3,4 -d /)'
alias 4up='cd /$(echo $PWD | cut -f 2,3,4,5 -d /)'
alias 5up='cd /$(echo $PWD | cut -f 2,3,4,5,6 -d /)'

bash가 별칭의 비밀번호를 확장하지 않도록 작은따옴표가 필요합니다. 이에 대한 함수를 작성할 수 있지만 5up과 5down만 필요합니다.

의견을 보내주셔서 감사합니다. 나는 cut을 사용하는 대신 순수 bash를 사용하여 경로 변수를 구문 분석하고 싶지만 실제로 해야 할 작업이 있습니다 ;-)

관련 정보