cd bằng cách gõ tên thư mục?


58

Tôi đã có điều này ở đâu đó 20 năm trước hoặc tôi đã mơ về nó.

Về cơ bản:

Nếu loại blobblobtôi nhận được
blobblob: command not found

Đủ công bằng.

Tôi muốn nó để khi shell của tôi gặp phải những lỗi đó - không tìm thấy lệnh - nó sẽ kiểm tra xem một thư mục có tồn tại với tên đó không ('blobblob') và nếu nó xảy ra cdvới thư mục đó.

Tôi chắc chắn có một số lý do cho việc không làm điều này hoặc làm nó một cách thận trọng.
Tôi chỉ nghĩ rằng nó sẽ khá gọn gàng và tôi muốn thử nó bằng cách tìm một nơi nào đó (như ở đây!).

Tôi không biết làm thế nào để thực hiện chương trình shell kinda này có thể ngụ ý.

Câu trả lời:


76
  • Bash: shopt -s autocd
  • Zsh: setopt autocd
  • tcsh: set implicitcd

Ngoài ra, 'autojump' là một công cụ hữu ích. Sau khi cài đặt, nó sẽ ghi nhớ các thư mục để bạn có thể gõ j abc và nếu bạn đã truy cập abc trước đó, hãy nói x / d / f / g / t / abc thì nó sẽ cd đến đó!
https://github.com/joelthelion/autojump


1
Yup tôi gõ shopt -s autocdvào dòng lệnh tại nó hoạt động. Bây giờ tôi chỉ có thể bắt đầu nhập tên thư mục và sử dụng tự động hoàn tất, sau đó nhấn return và shell cdcủa thư mục. Thật tuyệt !
Michael Durrant

6
Tuyệt quá. Cảm ơn đã chỉ ra một hành vi sai trái để tránh.
vonbrand

3
Tôi không sử dụng cái này - cdkhông khó để gõ và hầu hết các cơ chế hoàn thành tab sẽ thông minh hơn khi bạn cung cấp cho chúng nhiều ngữ cảnh hơn.
jw013

Sau khi viết lại một câu cảm thán quá mức về sự đánh giá cao, hãy để tôi nói rằng autocd thực sự là câu trả lời đúng: D
Luc

Các autocdshopt đã được bổ sung trong phiên bản bash 4. Vì vậy, nó không có sẵn trên hệ điều hành MacOS (mà vẫn có bash phiên bản 3.xx) trừ khi một thay thế, bash mới hơn được cài đặt (ví dụ, thông qua homebrew).
Quinn Comendant

2

Các tiện ích autojump cung cấp một cơ chế tương tự với một danh sách thư mục sử dụng nhiều nhất. Tuy nhiên, nó đòi hỏi phải thêm vào việc gõ jSpacenhưng điều này được bù lại bằng cách đoán đúng thường xuyên hơn không.

Đây là gần nhất với DWIM mà tôi đã sử dụng cho đến nay.


1

Tôi đã từng tạo một tập lệnh hữu ích cho mục đích tương tự, với hàm fcd cho find-n-cd.

Bạn gõ fcd foovà 3 điều có thể xảy ra:

  • Không có thư mục foo nào được tìm thấy, sau đó nó trở lại với "no such directory " $1
  • Một tập tin được tìm thấy: Nó kiểm tra xem nó có phải là một thư mục (hoặc chỉ là một tập tin) hay không và nếu có thì nó sẽ ở đó.
  • Nhiều tập tin được tìm thấy - sau đó một lựa chọn được trình bày, trong đó bạn chỉ cần nhập số lượng lựa chọn (hoặc một số đặc biệt để trả về).

Nó tương tự ở chỗ nó không cần bạn gõ toàn bộ đường dẫn, nhưng bạn đã gọi hàm một cách rõ ràng.

#!/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
}

Bạn phải sử sourcedụng hàm ( source fcd.sh| . fcd.sh) và không thể gọi nó là tập lệnh, bởi vì cdđiều khác chỉ xảy ra trong ngữ cảnh của tập lệnh và sau khi hoàn thành, bạn sẽ quay lại thư mục bắt đầu ngay lập tức.

Vì nó hoạt động với locate, nó khá nhanh trong việc tìm thư mục (nhưng không phải lúc nào cũng cập nhật).

Nó không xử lý khoảng trống trong tên thư mục một cách duyên dáng. Nếu bạn có một giải pháp tao nhã cho vấn đề tôi sẽ rất vui.


1
Câu hỏi là cdtự động, không cần gõ bất kỳ lệnh nào. Câu trả lời này phù hợp hơn cho điều hướng thư mục nhanh trong thiết bị đầu cuối .
manatwork

2
@manatwork: Chà, bạn có thể kết hợp lệnh với trình xử lý lỗi của bash. Trong /etc/bash.bashrcđó, trong ubfox, function command_not_found_handlecó vẻ như nó có thể được sửa đổi.
người dùng không xác định

Bắt được rồi. Cách này nghe tốt hơn nhiều.
manatwork

@manatwork: Tôi sẽ tự làm, nếu tôi muốn sử dụng nó cho mình. Nhưng nếu tôi muốn thay đổi thư mục, tôi muốn sử dụng một lệnh ngắn, nhưng nếu tôi gõ nhầm, tôi hiếm khi quên gõ 3 hoặc 4 ký tự. Có chương trình này bước vào sẽ khá khó chịu với tôi, nhưng sử dụng nó một cách rõ ràng là ổn.
người dùng không xác định

1

Điều này cũng hoạt động,

cdf name_of_file_or_directory

..given rằng bạn thiết lập một tập lệnh cdf.sh tùy chỉnh (bên dưới) có nguồn gốc trong trình bao. Đối với một thư mục là tham số, tập lệnh này chỉ đến thư mục mẹ cho thư mục tìm thấy. Thêm dòng sau vào .bashrc hoặc .zshrc, bất cứ điều gì ..

source ~/bin/cdf.sh 

Và thêm mã này vào tệp ~ / bin / cdf.sh mà bạn cần tạo từ đầu.

#!/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}
}

Câu trả lời tuyệt vời cho một câu hỏi cũ. Tôi tin rằng bạn sẽ nhận được một huy hiệu để làm sống lại một câu hỏi cũ và Chào mừng bạn đến với U & L.SE
eyoung100

0

Đặt cái này vào ~/.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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.