วิธีทำ 'cd dir / filename` พาฉันไป dir /?


10

ฉันคิดว่ามันสะดวกที่จะใช้cdกับอาร์กิวเมนต์ไฟล์

cd myDirectory/anyname.anyExtension จะเทียบเท่า cd myDirectory/

อะไรคือนามแฝงหรือหน้าที่ที่ดีที่สุดเพื่อให้บรรลุพฤติกรรมนี้

แก้ไข : ขอโทษฉันไม่ได้พูดถึงมันในสถานที่ที่ 1: ฉันใช้zsh

คำตอบ:


5

ในzshฉันมักจะทำ:

cd /path/to/somefile(:h)

( hสำหรับhead)

หากsomefileเป็น symlink คุณสามารถทำได้:

cd somefile(:A:h)

เพื่อไปยังไดเร็กทอรีที่พบเป้าหมายของ symlink


zshเทียบเท่าของคริสตอนนี้bashการแก้ปัญหาเท่านั้นจะเป็น:

cd() {
  [[ ! -e $argv[-1] ]] || [[ -d $argv[-1] ]] || argv[-1]=${argv[-1]%/*}
  builtin cd "$@"
}

ในzshนอกจากนี้คุณยังสามารถกำหนดสิ่งที่ "คำว่า" Ctrl-Wลบออก

ในzsh"คำว่า" ในบริบทของการเคลื่อนไหวคำตาม / transpose / วิดเจ็ตลบเป็นลำดับของ alnums บวกตัวอักษรในตัวแปรซึ่งเริ่มต้นโดยรวม$WORDCHARS/

คุณสามารถลบ/จาก$WORDCHARSเพื่อให้Ctrl-Wเพียงลบองค์ประกอบหนึ่งเส้นทาง:

WORDCHARS=${WORDCHARS/\/}

ส่วนขยายที่มีประโยชน์อีกอย่างคือselect-word-styleวิดเจ็ตที่คุณสามารถใช้เพื่อเลือกระหว่างสไตล์คำที่ต่างกัน

autoload select-word-style
zle -N select-word-style
bindkey '\ew' select-word-style

จากนั้นการกดAlt-Wช่วยให้คุณสามารถเลือกรูปแบบคำต่าง ๆ ได้

$ cd /blah/blih<Alt-W>
Word styles (hit return for more detail):
(b)ash (n)ormal (s)hell (w)hitespace (d)efault (q)uit
(B), (N), (S), (W) as above with subword matching
?

น่าสนใจ (ฉันใช้ zsh ด้วย)
Sébastien

การแก้ไขที่น่าสนใจมากเกี่ยวกับพลังของzshรูปแบบและคำ ขอบคุณสำหรับzshคำสั่ง มันทำงานได้อย่างสมบูรณ์แบบ
Sébastien

16

ฉันถือว่าคุณยังคงต้องการใช้งานฟังก์ชั่นดั้งเดิมถ้าคุณใส่ไดเรกทอรีและคุณกำลังใช้งานbashอยู่

cd() {
    local file="${!#}"

    if (( "$#" )) && ! [[ -d "$file" ]]; then
        builtin cd "${@:1:($#-1)}" "${file%/*}"
    else
        builtin cd "$@"
    fi
}

หากคุณไม่เคยใช้ตัวเลือกของ cd ( -Pฯลฯ ) สิ่งนี้ก็เพียงพอแล้ว:

cd() { 
    if [ -d "$1" ] || [ -z "$1" ]; then
        builtin cd "$@"
    else
        builtin cd "${1%/*}"
    fi
}

4
หากคุณเปลี่ยนชื่อฟังก์ชั่นเป็น cd อย่าลืมเพิ่มbuiltinหน้าการcdโทรไว้ด้วย
Ulrich Dangel

@ Chris: คุณถือว่าถูกต้อง;) ขอบคุณสำหรับสิ่งนี้พร้อมใช้งานฟังก์ชั่น
Sébastien

รุ่นที่รักษาตัวเลือกไม่ได้ทำงานกับcd zshคนที่เรียบง่ายใช้งานได้ดีzshแต่ BUT cdนั้นไม่เทียบเท่าอีกต่อไปเมื่อcd ~: /
Sébastien

@ เซบาสเตียนลองตอนนี้ฉันคิดว่ามันควรจะแก้ไข
Chris Down

@Chris แน่นอนเพิ่มการตรวจสอบ[ -z "$1" ]ก็เพียงพอแล้ว zshฉันได้รับการยอมรับคำตอบของสเตฟานที่จะให้มันมองเห็นมากขึ้นในขณะที่มันน่าจะเป็นทางออกที่ดีที่สุดสำหรับ
Sébastien

7

คุณสามารถใช้dirnameเพื่อตัดชื่อไฟล์ออกจากเส้นทางเช่น

mycd() { cd "$(dirname "$1")"; }

man dirnameดู


3
โปรดทราบว่าหากคุณป้อนไดเรกทอรีสิ่งนี้จะเปลี่ยนเป็นไดเรกทอรีด้านบนไดเรกทอรีดังกล่าวซึ่งอาจไม่เป็นที่ต้องการ (ไม่ชัดเจนจากคำถามว่าสิ่งนี้ต้องการหรือไม่)
Chris Down

1
@ChrisDown จริง แต่ฉันปล่อยให้มันเป็นแบบฝึกหัดให้กับผู้อ่านและคำตอบของคุณจะแสดงวิธีจัดการกับมัน
Adrian Frühwirth

1
@ AdrianFrühwirthออกกำลังกาย! ฮะ!

3

หากคุณเพิ่มสิ่งนี้ลงในของคุณ.profileให้โหลด ( source ~/.profileหรือออกจากระบบและลงชื่อเข้าใช้อีกครั้ง) จากนั้นmycd [file or directory]จะนำคุณไปยังไดเรกทอรีที่ถูกต้อง:

mycd() { if [ -d "$1" ]; then cd "$1"; else cd "$( dirname "$1" )"; fi ; }

หากคุณตั้งชื่อมันcdสิ่งแปลก ๆ ก็จะเกิดขึ้น


1
สิ่งนี้จะแตกถ้าชื่อไดเร็กทอรีมีช่องว่างและคุณต้องการเซมิโคลอนปิดเพื่อยกเลิกกลุ่มคำสั่ง แก้ไขให้คุณหวังว่าคุณจะไม่รังเกียจ
Chris Down

@ChrisDown แต่ที่แท้จริงของเปลือกหอยอื่น ๆ zshที่คุณไม่จำเป็นต้องอัฒภาคปิดใน
Stéphane Chazelas

นอกจากนี้ยังแบ่งนี้ถ้าผ่าน args ไปเช่นcd -P
Chris Down

0
cd2() {
 arg=() dir= cmd= IFS=" " msg='[-L|[-P [-e]]|-h] [dir|file]'

 while [ "$#" -gt 1 ] ; do
  case "$1" in
   -h) printf "%s: cd2 %s\n" "$0" "$msg"
    return 1 ;;
   *) arg+=("$1") ;;
  esac
  shift
 done

 [ -f "${1:-}" ] && dir="$(dirname ${1:-})" || dir="${1:A}"
 [ ! -z "$arg" ] && cmd="cd ${arg[@]} $dir" || cmd="cd $dir"

 if ! $cmd 2>/dev/null; then
  printf "%s: cd2 %s\n" "$0" "$msg"
  return 1
 fi
}

รับไดเรกทอรีชื่อ$(sudo reboot)ฟังก์ชั่นนี้อาจรีบูตระบบ นอกจากนี้ผู้ใช้กำลังใช้zshงานbashอยู่
Kusalananda

ให้คำสั่งใด ๆ $ (sudo รีบูต) ฟังก์ชั่นนี้จะรีบูตระบบ นอกจากนี้ +1 ฉันไม่ได้สังเกตเห็นว่า 'zsh' เริ่มแรก - เป็นสิ่งที่ดี
ecwpz91

ไม่cd '$(sudo reboot)'จะเปลี่ยนไดเรกทอรีในขณะที่ฟังก์ชันของคุณพยายามประเมินชื่อ
Kusalananda

อ่าฉันเห็นและทำการเปลี่ยนแปลง แจ้งให้เราทราบว่าใช้งานได้หรือไม่ จับดี.
ecwpz91
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.