디렉토리 이름을 입력하여 cd?


58

나는 20 년 전 어딘가에 있거나 꿈을 꾸었습니다.

원래:

만약 blobblob내가 타입 이라면
blobblob: command not found

그럴 수 있지.

쉘에서 오류가 발생하면 (명령을 찾을 수 없음) 디렉토리에 해당 이름 ( 'blobblob')이있는 디렉토리가 있는지 확인하고 디렉토리에 있는지 확인합니다 cd.

나는 이것을하지 않거나주의를 기울여야하는 몇 가지 이유가 있다고 확신합니다.
나는 그것이 꽤 깔끔 할 것이라고 생각하고 어딘가에 (여기처럼!)를 찾아서 시도하고 싶습니다.

이것이 의미하는 일종의 쉘 프로그래밍을 수행하는 방법을 모르겠습니다.

답변:


76
  • 세게 때리다: shopt -s autocd
  • Zsh : setopt autocd
  • tcsh : set implicitcd

또한 'autojump'는 유용한 도구입니다. 일단 설치되면 디렉토리를 기억하여 j abc를 입력 할 수 있으며 이전에 abc를 방문한 적이 있다면 x / d / f / g / t / abc라고 말하면 CD가 나타납니다!
https://github.com/joelthelion/autojump


1
shopt -s autocd, 명령 줄에 입력 했습니다. 이제 디렉토리 이름 입력을 시작하고 자동 완성을 사용한 다음 return 키를 누르고 셸을 cd디렉토리에 넣을 수 있습니다. 너무 멋져요!
Michael Durrant

6
큰. 피해야 할 잘못된 기능을 지적 해 주셔서 감사합니다.
vonbrand

3
나는 이것을 사용하지 않는다- cd타이핑하기가 어렵지 않으며 대부분의 탭 완성 메커니즘은 더 많은 컨텍스트를 제공 할 때 더 똑똑합니다.
jw013

지나친 감사의 느낌을 뒷받침 한 후 autocd가 실제로 정답이라고 말하겠습니다 : D
Luc

autocdshopt 내부는 bash는 버전 4에서 추가되었다 그래서 (여전히 bash는 버전 3.xx이있는) 대체하지 않는 한, 새로운 배쉬 (사제를 통해, 예를 들어)가 설치된 맥 OS에서 사용할 수 없습니다.
Quinn Comendant

2

autojump 유틸리티는 가장 많이 사용되는 디렉토리 목록과 유사한 메커니즘을 제공합니다. 그러나 타이핑에 추가 된 요소가 필요 jSpace하지만 그렇지 않은 경우보다 자주 추측 하여 보상합니다.

이것은 내가 사용했던 DWIM 과 가장 가까운 것입니다.


1

find-n-cd를위한 fcd 함수를 사용하여 비슷한 목적으로 유용한 스크립트를 만들었습니다 .

입력하면 fcd foo3 가지 일이 발생할 수 있습니다.

  • 그러한 디렉토리 foo가 없으면 다음과 같이 반환됩니다. "no such directory " $1
  • 하나의 파일이 발견되었습니다. 디렉토리인지 파일인지 테스트하고, 그렇다면 파일을 CD로 보냅니다.
  • 여러 파일이 발견되면 선택 번호가 표시됩니다. 선택 항목의 번호 (또는 반환 할 특수 번호) 만 입력하면됩니다.

전체 경로를 입력 할 필요는 없지만 함수를 명시 적으로 호출한다는 점에서 비슷합니다.

#!/bin/bash
#
# find cd. For input foo, find all directories .../.../foo 
# GPLv3 Stefan Wagner (2010, 2012)
#
# doesn't handle blanks in directory names gracefully.
#
fcd () 
{
    list=$(locate $1 | egrep "/$1$")
    count=$(echo $list | wc -w )
    case $count in 
      0) 
        echo "unknown directory: "$1 && return
        # could search for partial matches Doc => Documentation
        ;;
      1) 
        if [[ -d "$list" ]]; then
        echo "$list";
        cd "$list";
        else
            echo "not a directory: $1"
        fi
        ;;
      *) 
        select directory in $list "/exit/" 
        do
          if [[ "$directory" = "/exit/" ]]; then break; fi
          if [[ -d "$directory" ]]; then
                echo "$directory";
                cd "$directory";
            break
          else
            echo "not a directory: "$1 
          fi
        done     
        ;;
   esac
}

당신은에있는 source(기능 source fcd.sh| . fcd.sh)하고 있기 때문에, 스크립트로 호출 할 수 없습니다 cd다른 단지 스크립트의 맥락에서 일어날 것, 그리고 마무리 후 즉시 다시 시작 디렉토리에 될 일이있다.

와 함께 작동하기 때문에 locate디렉토리를 찾는 것이 매우 빠릅니다 (그러나 항상 최신 것은 아닙니다).

디렉토리 이름의 공백을 정상적으로 처리하지 않습니다. 문제에 대한 우아한 해결책이 있다면 기쁠 것입니다.


1
문제는 cd명령을 입력하지 않고 자동으로하는 것이 었습니다 . 이 답변은 터미널의 빠른 디렉토리 탐색에 더 적합합니다 .
manatwork

2
@manatwork : 글쎄, 당신은 명령을 bash의 오류 처리기와 결합 할 수 있습니다. 에서 /etc/bash.bashrc, 우분투에서는,이 function command_not_found_handle그것을 수정할 수있는 것처럼 보이는.
사용자가 알 수 없음

잡았다. 이 방법은 훨씬 더 잘 들립니다.
manatwork

@ manatwork : 직접 사용하고 싶다면 직접 할 것입니다. 그러나 디렉토리를 변경하려면 짧은 명령을 사용하고 싶지만 무언가 잘못 입력하면 3 ~ 4자를 입력하는 것을 거의 잊어 버렸습니다. 이 프로그램을 시작하는 것은 다소 성가신 일이지만 명시 적으로 사용하는 것이 좋습니다.
사용자가 알 수 없음

1

이것은 또한 작동합니다.

cdf name_of_file_or_directory

.. 쉘에서 제공되는 사용자 정의 cdf.sh 스크립트 (아래)를 설정했습니다. 매개 변수 인 디렉토리의 경우이 스크립트는 찾은 디렉토리의 상위 디렉토리로만 가져옵니다. .bashrc 또는 .zshrc에 다음 줄을 추가하십시오.

source ~/bin/cdf.sh 

이 코드를 ~ / bin / cdf.sh 파일에 추가하여 처음부터 작성해야합니다.

#!/bin/bash

function cdf() {
    THEFILE=$1
    echo "cd into directory of ${THEFILE}"
    # For Mac, replace find with mdfind to get it a lot faster. And it does not need args ". -name" part.
    THEDIR=$(find . -name ${THEFILE} |head -1 |grep -Eo "/[ /._A-Za-z0-9\-]+/")
    cd ${THEDIR}
}

오래된 질문에 대한 훌륭한 답변. 난 당신이 U & L.SE에 대한 오래된 질문을 살리기위한 배지 및 환영받을 수 있습니다 생각
eyoung100

0

이것을 당신의 ~/.bashrc

  #aliases to cd into the core dirs
  PROJECT_PARENT_DIRS[0]="$HOME/repos"
  #you can make it search more dirs by assigning new indexes to your other root dirs

  for PARENT_DIR in ${PROJECT_PARENT_DIRS[@]} ; do
    if [ -d "$PARENT_DIR" ]; then
      for PROJECT_DIR in $(/bin/ls $PARENT_DIR); do
        if [ ! -z `which $PROJECT_DIR` ]; then
          continue # don't set alias if there is something already a command on the path with the same name
        fi
        if [ -d "$PARENT_DIR/$PROJECT_DIR" ]; then
          alias "$PROJECT_DIR"="cd $PARENT_DIR/$PROJECT_DIR"
        fi
      done
    fi
  done
  #end alias
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.