cd โดยเพียงพิมพ์ชื่อไดเรกทอรี?


58

ฉันมีสิ่งนี้เมื่อ 20 ปีก่อนหรือฉันฝันเกี่ยวกับมัน

โดยทั่วไป:

ถ้าblobblobฉันพิมพ์
blobblob: command not found

ยุติธรรมพอสมควร

ฉันต้องการมันเพื่อให้เมื่อเปลือกของฉันได้รับข้อผิดพลาด - ไม่พบคำสั่ง - มันจะตรวจสอบเพื่อดูว่ามีไดเรกทอรีที่มีชื่อนั้น ('blobblob') หรือไม่และถ้ามันcdเป็นไดเรกทอรีนั้น

ฉันแน่ใจว่ามีเหตุผลบางอย่างที่จะไม่ทำเช่นนี้หรือทำอย่างระมัดระวัง
ฉันคิดว่ามันจะค่อนข้างเรียบร้อยและฉันอยากลองโดยการค้นหาว่าที่ไหนสักแห่ง (เช่นที่นี่!)

ฉันไม่ทราบวิธีการเขียนโปรแกรม kinda shell ซึ่งอาจบอกเป็นนัย

คำตอบ:


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

หลังจาก backspacing อัศเจรีย์มากเกินไปขอให้ฉันแค่บอกว่า autocd เป็นคำตอบที่ถูกต้อง: D
Luc

autocdshopt ถูกเพิ่มเข้ามาในรุ่นทุบตี 4. ดังนั้นจึงไม่สามารถใช้ได้กับ MacOS (ซึ่งยังคงมีรุ่นทุบตี 3.xx) เว้นแต่จะมีการสลับทุบตีใหม่มีการติดตั้ง (เช่นผ่าน homebrew)
Quinn Comendant

2

ยูทิลิตี้ autojumpให้เป็นกลไกที่คล้ายกันกับรายการไดเรกทอรีส่วนใหญ่ใช้อย่างหนัก อย่างไรก็ตามมันต้องการการเพิ่มความน่าเบื่อของการพิมพ์jSpaceแต่สิ่งนี้จะชดเชยด้วยการเดาที่ถูกต้องบ่อยกว่าไม่

นี่คือDWIMที่ใกล้เคียงที่สุดที่ฉันเคยทำ


1

ฉันเคยทำสคริปต์ที่มีประโยชน์สำหรับวัตถุประสงค์ที่คล้ายกันด้วยฟังก์ชั่นfcdสำหรับ find-n-cd

คุณพิมพ์fcd fooและ 3 สิ่งที่อาจเกิดขึ้น:

  • ไม่พบไดเรกทอรีฟูดังกล่าวจากนั้นจะส่งคืนพร้อม "no such directory " $1
  • พบหนึ่งไฟล์: มันทดสอบว่าเป็นไดเรกทอรี (หรือเพียงแค่ไฟล์) และถ้าเป็นเช่นนั้นมันจะอยู่ที่นั่น
  • พบไฟล์หลายไฟล์ - จากนั้นจะมีการเลือกซึ่งคุณเพียงพิมพ์หมายเลขของสิ่งที่เลือก (หรือหมายเลขพิเศษเพื่อส่งคืน)

มันคล้ายกับที่ไม่ต้องการให้คุณพิมพ์เส้นทางทั้งหมด แต่คุณได้เรียกใช้ฟังก์ชันอย่างชัดเจน

#!/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จะเกิดขึ้นเฉพาะในบริบทของสคริปต์เท่านั้นและหลังจากเสร็จสิ้นคุณจะกลับมาเริ่มต้น dir ทันที

เนื่องจากใช้งานlocateได้มันค่อนข้างเร็วในการค้นหาไดเรกทอรี (แต่ไม่เสมอไป)

ไม่จัดการช่องว่างในชื่อไดเรกทอรีอย่างสง่างาม หากคุณมีทางออกที่สง่างามสำหรับปัญหาฉันจะมีความสุข


1
คำถามคือcdโดยอัตโนมัติโดยไม่ต้องพิมพ์คำสั่งใด ๆ คำตอบนี้จะเหมาะสำหรับการนำทางไดเรกทอรีด่วนใน terminal
จัดการ

2
@ การผลิต: ดีคุณสามารถรวมคำสั่งกับตัวจัดการข้อผิดพลาดของทุบตี ใน/etc/bash.bashrcนั้นมีในอูบุนตู function command_not_found_handleซึ่งดูเหมือนว่าจะสามารถแก้ไขได้
ผู้ใช้ที่ไม่รู้จัก

เข้าใจแล้ว วิธีนี้ฟังดูดีขึ้นมาก
ผลิต

@ การผลิต: ฉันจะทำเองถ้าฉันต้องการใช้ด้วยตัวเอง แต่ถ้าฉันต้องการเปลี่ยนไดเรกทอรีฉันชอบที่จะใช้คำสั่งสั้น ๆ แต่ถ้าฉันพิมพ์ผิดฉันแทบจะไม่ลืมพิมพ์ 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.