심볼릭 링크의 별칭과 동일합니까?


18

나는 종종 내 홈 폴더의 몇 가지 디렉토리를 뛰어 다니며 작성하는 데 지쳐 야한다고 생각합니다. 전통적으로 상징적 인 링크 인 빠른 접근 방식을 원합니다.

그러나 수십 개의 심볼릭 링크로 홈 디렉토리를 어지럽히고 싶지 않습니다. ~/links/디렉토리를 만들어 심볼릭 링크로 어지럽 힐 는 있지만 여전히 추악합니다. 게다가, 나는 매일 (.bashrc에 정의되어 있음) 현재 디렉토리로 이동하는 기호 링크를 만들고 싶을 수도 있습니다.

심볼릭 링크의 별칭을 효과적으로 지정하여 빠른 탐색을위한 링크로 인식 될 수 있지만 ls홈 디렉토리를 만들 때 실제로 나타나지 않고 현재 세션을 넘어 가지 않는 방법이 있습니까?


4
밀고 터지는 모습을보고 싶을 수도 있습니다
Rui F Ribeiro

Jeroen Janssen의 접근 방식이 이러한 정확한 요구에 적합하고 저렴하다는 것을 알았습니다
Theophrastus

2
어떤 쉘을 사용하고 있습니까?
Gilles 'SO- 악마 중지

@Theophrastus Heh — 기본적으로 내가 대답 한대로 우아하게 다시 구현 한 것입니다.
mattdm

3
당신이 찾고있는,하지만 여전히 두 directoris 사이에 앞뒤로 점프 할 때 유용하게 사용할 수 정확히 무엇을 : cd -의지 cd의 마지막 디렉토리로 이전했다. 따라서 두 번 수행하면 시작한 곳으로 돌아갑니다 ... "이전 위치에서 someFile.txt를 편집하는 것을 잊었습니다"=> 간단히 : cd -, someFile.txt 편집cd -
dingalapadum

답변:


12

탭 완성을 사용할 수 있습니다. 많은 Linux 배포판에서 기본적으로 bash는 [TAB] 키를 눌렀을 때 가능한 일치 목록이 표시되거나 일치하는 항목이 하나만 있으면 모두 채워지도록 설정됩니다. cd의 경우, 이것은 일반적으로 현재 작업 디렉토리의 서브 디렉토리 목록입니다. 덮어 쓸 수는 있지만 대신 jd"jump directory" 와 같은 별칭을 만드는 것이 좋습니다 .

alias jd=cd

그런 다음 원하는 "책갈피"를 jd의 완성으로 정의하십시오. bash 매뉴얼 페이지에서 더 많은 옵션 (명령 또는 함수에서 즉시 결과 자동 생성 포함)을 확인하십시오.하지만 가장 쉬운 방법은 다음과 같은 단어 목록입니다 -W.

완전한 -W "/ srv / www ~ / tmp ~ / work"jd

이제 jd[TAB]를 입력 하고 누르면 "북마크"가 표시됩니다. 모호한 부분을 입력 한 다음 [TAB]을 눌러 완료하십시오. (위에서 ~s가 내 홈 디렉토리로 확장되므로 첫 번째 [TAB]은 나에게을 제공하고 /, w다시 누르면 [TAB] /srv/www가 채워집니다.)

물론 ~/.bash_profile이것을 지속시키기 위해 이것을 넣으 십시오.

또는 다음 단계로 넘어갈 수 있습니다. ~/.shortcuts점으로 시작 하여 디렉토리를 숨기고 깔끔한 홈 디렉토리를 만들지 말고 원하는 디렉토리에 대한 심볼릭 링크로 채우십시오. 그런 다음 넣어 에 ~ / .bash_profile에 :

_list_shortcuts() 
{ 
    COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
    cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd

이것은 _list_shortcuts이름 목록을 작성하기 위해 기능에서 약간 더 복잡한 완성을 정의하며 jd, 단순한 별칭과 다른 기능을하기 때문에 단순한 별칭이 아닌 함수로 만듭니다 cd. -P에 플래그를 cd만든다 그것은 심볼릭 링크를 해결, 그래서 모든 것을 투명 마법된다. 바로 가기 이름은 대상과 일치하지 않아도됩니다.

그래서:

$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm  8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work

그리고 추가 공상을 위해 jd매개 변수없이 실행될 때 모든 바로 가기를 나열하십시오.

jd()
{
    if [[ -z "$1" ]]; then
      (cd ~/.shortcuts; stat -c '%N' *)
    else
      cd -P ~/.shortcuts/$1
    fi
}

참고 : 나는 후자가 나를 위해 결코 작동하지 않기 때문에 compgen -W $( cmd )대신 사용 compgen -C 'cmd'하고 이유를 이해하지 못합니다. 그것은 내 자신의 새로운 질문일지도 모른다. :)


매우 흥미로운. 하나의 캐치이지만 jd로 완료하기 전에 전체 링크를 입력하거나 모호하지 않게 될 수있는 링크를 입력해야합니다. jd 명령에 별칭을 추가하여 단축시키는 방법은 무엇입니까? 또는 내가 생각하는 심볼릭 링크를 저장할 수있는 디렉토리에 상대적으로 만듭니다.
dsollen

@dsollen 업데이트 참조 :)
mattdm 1

이것은 완벽하게 작동했습니다. 모든 정직에서 나는이 질문에 대한 좋은 대답을 기대하지는 않았지만 이것은 내가 원하는 것과 거의 같습니다. 나는 이것을 꽤 많이 사용할 것으로 예상하고 새로운 VM을 얻을 때마다 내가 수정 한 것들의 목록에 추가 할만 큼 깨끗하다고 ​​느낍니다 (표준 환경 변경 사항을 새로운 vm lol에 자동으로 복제하는 방법조차 있습니다). 고마워요 더 많은 자유 시간이있는 시점에서 COMPREPLY 구문이 어떻게 작동하는지 알아낼 것입니다.)
dsollen

18

쉘 별명에는 이름 완성 (일부)을 수행 할 수있는 기능이 있습니다 (보통에 바인딩 됨 tab). 또는 CDPATH"최근"(지난 5-6 년 이내) 기능을 사용하여 이름 완성을 지원할 수 있습니다. 그것이 당신에게 효과가 있다면, 당신이 입력하는 것이 그 디렉토리에 대한 니모닉이 아니라 실제 디렉토리 이름이라는 이점이 있습니다.

bash 매뉴얼에 따르면

CDPATH
cd내장 명령 의 검색 경로로 사용되는 콜론으로 구분 된 디렉토리 목록 .

더 읽을 거리 :


CDPATH환경 변수 에 대해 몰랐습니다 . 감사합니다. 내 git_repos변수를 해당 변수에 추가 할 수 있습니다 ....
Wildcard

16

자주 사용하지만 매일 변경되지 않는 디렉토리의 경우 다른 옵션은 파일에 여러 alias명령 을 갖는 것입니다 .bashrc.

alias cdo="cd /u01/app/oracle"
alias cdw="cd /var/www/html" 

친구는 약 50 명 정도입니다. 나는 소수가 있습니다; 빠르고 쉬운. 다만

cdo

디렉토리를 / u01 / app / oracle로 변경


과연. 나는이 메커니즘을 1990 년대 초부터 사용했습니다.
wallyk

7

나는 추천 pushd하고 popd.

개인적으로 여러 디렉토리가 관련된 개발 작업을 수행하거나 소스 코드를 읽을 때 편리하다고 생각합니다.

이들은 스택 구조 / LIFO를 효과적으로 구현하며, 여기서 디렉토리를 푸시하고 ( pushd) 다음 POP 디렉토리 명령 ( popd)이이를 검색합니다.

따라서 디렉토리 안에있을 때 다음을 수행합니다.

pushd .

그리고 당신이 그것을 검색해야 할 때, 당신은

popd

디렉토리로 돌아 가기 위해 여러 번 수행 pushd하고 popd나중에 해당 작업을 수행 할 수 있습니다 .

나는 여기에 링크를 남길 것이다.

http://www.eriwen.com/bash/pushd-and-popd/


1
이것은 popd많이 사용하지 않는 것을 제외하고는 내가 사용하는 솔루션 입니다. 내 dirs목록 ( pushd명령 으로 채워짐 )을 해당 시간 동안 방문 / 작업하려는 모든 디렉토리 로 채운 다음 실행 pushd +1합니다. 그런 다음, 간단한과 디렉토리를 통해 I 캔주기 !pu매우 빠르게. (Ubuntu와 CentOS 모두 에서 시작하는 새로 설치에서 사용할 수 pushd있는 유일한 명령입니다 pu.)
Wildcard

3

당신은 당신의 변수로 넣어 수 있습니다 ~/.bashrc, 그리고 그들은 단지있어 $멀리.

$ cat ~/.bashrc
if [ "$PS1" ]
then
    export myproj=~/todays/fancy/project
fi

$ cd $myproj

3

명백한 대답은 변수 인데, 파일 시스템의 심볼릭 링크와 유사하게 다른 것들을 나타내는 쉘의 심볼릭 것들입니다.

path/to/project $ project=$PWD
path/to/project $ cd $elsewhere   # Previously created
path/to/elsewhere $ cd $project
path/to/project $ logout          # Variables gone, as required

괜찮은 쉘 Tab에서 변수 이름을 완성하면 도움이됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.