`` Cd dir / dosyaadı``n beni dir / dizinine nasıl yönlendirebilirim?


10

cdBir dosya argümanı ile kullanabilmek çok uygun olurdu .

cd myDirectory/anyname.anyExtension eşit olacaktır cd myDirectory/

Bu davranışı elde etmek için en iyi takma ad veya işlev ne olabilir?

EDIT : Üzgünüm 1. sırada bahsetmedim: kullanıyorumzsh

Yanıtlar:


5

İçinde zshsık sık yaparım:

cd /path/to/somefile(:h)

( hiçin head).

Eğer somefilebir sembolik bağdır, ayrıca yapabilirsiniz:

cd somefile(:A:h)

Simge bağlantısının hedefinin bulunduğu dizine ulaşmak için.


zshChris eşdeğer şimdi bash-sadece çözüm olacaktır:

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

'De zsh, hangi "kelimelerin" Ctrl-Wkaldırılacağını da yeniden tanımlayabilirsiniz .

Olarak zsh, kelime bazlı hareket / devrik / silme aletler bağlamında "ifadesi" olarak alnums sekansları artı karakterlerdir $WORDCHARSvarsayılan içeren değişken /.

Sen kaldırmak olabilir /dan $WORDCHARSböylece Ctrl-Wyalnızca bir yol bileşenini siler:

WORDCHARS=${WORDCHARS/\/}

Başka bir kullanışlı uzantı, select-word-stylefarklı kelime stilleri arasında etkileşimli olarak seçim yapmak için kullanabileceğiniz widget'tır.

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

Ardından tuşuna basarak Alt-Wfarklı kelime stilleri arasında seçim yapabilirsiniz.

$ 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
?

İlginç. (Ben de zsh kullanıyorum).
Sébastien

Gücü zshve kelime stilleri üzerinde çok ilginç bir düzenleme . zshKomuta için de teşekkürler . İşi mükemmel yapıyor.
Sébastien

16

Bir dizin girerseniz ve kullanıyorsanız orijinal işlevselliğini korumak istediğinizi varsayalım bash.

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

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

Asla cd'nin seçeneklerini ( -P, vb.) Kullanmayacaksanız, bu da yeterli olacaktır:

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

4
işlev adını cd olarak değiştirirseniz, aramaların builtinönüne eklediğinizden emin oluncd
Ulrich Dangel

@Chris: Doğru kabul ettiniz;) Bu kullanıma hazır fonksiyon için teşekkürler
Sébastien

cdSeçenekleri koruyan sürüm çalışmaz zsh. Daha basit olan iyi çalışır zsh, ancak cdartık şu şekilde eşdeğer değildir cd ~: /
Sébastien

@Sebastien Şimdi deneyin, bunun düzeltilmesi gerektiğini düşünüyorum.
Chris Down

@Chris, gerçekten bir çek eklemek [ -z "$1" ]yeterliydi. Stephane'ın en iyi çözüm gibi göründüğü için daha fazla görünürlük sağlamak için cevabını kabul ettim zsh.
Sébastien

7

dirnameDosya adını yoldan ayırmak için kullanabilirsiniz , örn.

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

Bkz man dirname.


3
Bir dizin girerseniz, bu dizinin üzerindeki dizine değiştirilemez, bu istenmeyebilir (bunun istenip istenmediği sorusundan belirsizdir).
Chris Down

1
@ChrisDown Doğru, ama bunu okuyucuya bir alıştırma olarak bıraktım ve cevabınız bununla nasıl başa çıkacağınızı gösteriyor.
Adrian Frühwirth

1
@ AdrianFrühwirth Bir egzersiz! Hah!

3

Bunu kendinize eklerseniz .profile, yükleyin ( source ~/.profileveya oturumu kapatın ve tekrar oturum açın), o mycd [file or directory]zaman sizi doğru dizine götürür:

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

Adını verirseniz cd, garip şeyler olur.


1
Dizin adı boşluk içeriyorsa ve komut grubunu sonlandırmak için bir noktalı virgül kullanmanız gerekiyorsa bu kesilir. Sizin için düzenledi, umarım umursamazsın.
Chris Down

@ChrisDown, bu diğer mermiler için geçerli olsa da, kapanış noktalı virgülüne ihtiyacınız yok zsh.
Stéphane Chazelas

Ayrıca, bu tatili için args geçirmeden eğer cdgibi -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
}

Adlı bir dizin verildiğinde $(sudo reboot), bu işlev sistemi yeniden başlatabilir. Ayrıca, kullanıcı kullanıyor zsh, kullanmıyor bash.
Kusalananda

Herhangi bir komut $ (sudo reboot) verin, bu fonksiyon sistemi yeniden başlatacaktır. Ayrıca, +1 Ben başlangıçta 'zsh' fark etmedi - iyi yakalamak.
ecwpz91

Hayır, cd '$(sudo reboot)'dizini değiştirirken, işleviniz adı değerlendirmeye çalışacaktır.
Kusalananda

Ah, gördüm ve değişiklikler yaptım. Bunun işe yarayıp yaramadığını bana bildirin? İyi yakalama.
ecwpz91
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.