Sadece müdürün adını yazarak cd?


58

Bunu 20 yıl önce bir yerde yaşadım ya da hayal ettim.

Temelde:

Eğer tür blobblobalırsam
blobblob: command not found

Yeterince adil.

Öyle isterim ki, kabuğum bu hataları aldığında - komut bulunamadı - bir dizinin bu isimde ('blobblob') olup olmadığını cdve bu dizinin içinde olup olmadığını kontrol eder.

Bunu yapmamak veya dikkatle yapmak için bazı nedenler olduğundan eminim.
Ben sadece oldukça temiz olacağını düşünüyorum ve nasıl bir yerde (burada gibi!) Bularak bir denemek istiyorum.

Bu tür kabuk programlama yapmak nasıl bir fikrim yok, bu ima edebilir.

Yanıtlar:


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

Ayrıca, 'otomatik atlama' kullanışlı bir araçtır. Kurulduktan sonra, j abc yazabilmeniz için dizinleri hatırlar ve daha önce abc'yi ziyaret ettiyseniz, x / d / f / g / g / t / abc yazın, o zaman cd oraya gelecek!
https://github.com/joelthelion/autojump


1
Evet shopt -s autocd, komut satırında yazdım . Şimdi sadece dizin adlarını yazmaya başlayabilirim ve otomatik tamamlama işlevini kullanabilirim ve sonra return tuşuna basarak kabuğun cddizine girebilirim. Çok havalı !
Michael Durrant

6
Harika. Kaçınılması gereken bir yanlışlığı işaret ettiğiniz için teşekkür ederiz.
von

3
Bunu kullanmıyorum - yazmak cdo kadar da zor değil ve çoğu sekme tamamlama mekanizması daha fazla bağlam verdiğinizde daha akıllı.
jw013

Aşırı takdir ünleminin geri çekilmesinden sonra, autocd'nin gerçekten doğru cevap olduğunu söyleyeyim: D
Luc

autocdShopt bash sürümü 4'te eklenmiştir yüzden (hala bash sürümü 3.xx sahip olan) bir alternatif olmadıkça, yeni bash (homebrew aracılığıyla, örneğin) yüklü MacOS üzerinde kullanılamaz.
Quinn Comendant

2

Otomatik atlama yardımcı programı , En Çok Kullanılan Dizin listesiyle benzer bir mekanizma sağlar. Bununla birlikte, ilave tipte yazım todyumu gerektirir, jSpaceancak bu doğru olmamaktan daha sık tahmin ederek telafi edilir.

Bu, bugüne kadar kullandığım DWIM'e en yakın olanı .


1

Bir keresinde benzer bir amaç için find-n-cd için fcd işlevi olan kullanışlı bir script hazırladım .

Siz yazın fcd foove 3 şey olabilir:

  • Bu tür bir foo bulunamadı, sonra döndürür "no such directory " $1
  • Bir dosya bulundu: Bir dizin (veya sadece bir dosya) olup olmadığını test eder ve eğer öyleyse, orada cds.
  • Birden fazla dosya bulunur - daha sonra sadece seçimin numarasını (veya geri dönüş için özel bir sayı) yazdığınız bir seçim sunulur.

Tüm yolu yazmanız gerekmediği için benzerdir, ancak işlevi açıkça çağırdınız.

#!/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İşleve ( source fcd.sh| . fcd.sh) sahip olmalısınız ve onu komut dosyası olarak adlandıramazsınız, çünkü cdyalnızca komut dosyası bağlamında gerçekleşir ve bitirdikten sonra sizi hemen başlangıçtaki dizinize geri alırsınız.

O ile çalışır bu yana locate, bu dizinleri (ama her zaman güncel) bulmakta oldukça hızlı.

Dizin isimlerindeki boşlukları incelikle ele almaz. Sorun için zarif bir çözüm varsa ben mutlu olurum.


1
Soru cdherhangi bir komut yazmadan otomatik olarak oldu . Bu cevap terminaldeki Hızlı rehber navigasyonu için daha uygundur .
Manatwork

2
@ manatwork: Komutu bash hata işleyicisiyle birleştirebilirsiniz. Yılında /etc/bash.bashrc, ubuntu içinde, bir orada function command_not_found_handleo modifiye edilebilir gibi görünen hangi.
kullanıcı bilinmeyen

Yakaladım seni. Bu yol çok daha iyi geliyor.
Manatwork

@ manatwork: Kendim kullanmak istersem kendim yapardım. Fakat eğer dizini değiştirmek istersem, kısa bir komut kullanmak isterim, fakat bir şeyi yanlış yazarsam, nadiren 3 veya 4 karakter yazmayı unuttum. Bu programın devreye girmesi benim için can sıkıcı bir durum olacak, ama açıkça kullanmak iyi.
kullanıcı bilinmeyen

1

Bu da işe yarıyor

cdf name_of_file_or_directory

..güvenli bir cdf.sh betiği (aşağıda) ayarladıysanız, kabuktan kaynaklanmış. Parametre olarak bir dizin için bu betik sadece bulunan dizine ait üst dizine geçer. .Bashrc veya .zshrc dosyalarına aşağıdaki satırı ekleyin.

source ~/bin/cdf.sh 

Ve bu kodu, sıfırdan oluşturmanız gereken ~ / bin / cdf.sh dosyasına ekleyin.

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

Eski bir soruya iyi cevap. Eski bir soruyu canlandırmak için bir rozet alacağınıza inanıyorum ve U & L.SE'ye Hoşgeldiniz
eyoung100

0

Bunu içine koy. ~/.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
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.