cd dengan mengetikkan nama direktori?


58

Saya memiliki 20 tahun yang lalu di suatu tempat atau saya bermimpi tentang hal itu.

Pada dasarnya:

Jika jika tipe blobblobsaya dapatkan
blobblob: command not found

Cukup adil.

Saya ingin agar ketika shell saya mendapatkan kesalahan itu - perintah tidak ditemukan - memeriksa untuk melihat apakah ada direktori dengan nama itu ('blobblob') dan jika ia melakukannya cdke direktori itu.

Saya yakin ada beberapa alasan untuk tidak melakukan ini atau melakukannya dengan hati-hati.
Saya hanya berpikir itu akan sangat rapi dan saya ingin mencobanya dengan mencari cara di suatu tempat (seperti di sini!).

Saya tidak tahu bagaimana melakukan pemrograman shell ini mungkin menyiratkan.

Jawaban:


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

Juga, 'autojump' adalah alat yang berguna. Setelah diinstal, ia akan mengingat direktori sehingga Anda dapat mengetik j abc dan jika Anda pernah mengunjungi abc sebelumnya, katakanlah x / d / f / g / t / abc maka ia akan berpindah ke sana!
https://github.com/joelthelion/autojump


1
Yup saya mengetik shopt -s autocddi baris perintah itu berhasil. Sekarang saya bisa mulai mengetik nama direktori dan menggunakan autocomplete dan kemudian tekan kembali dan shell cdke dalam direktori. Keren abis !
Michael Durrant

6
Bagus. Terima kasih telah menunjukkan kesalahan untuk menghindari.
vonbrand

3
Saya tidak menggunakan ini - cdtidak sulit untuk mengetik, dan sebagian besar mekanisme penyelesaian-tab lebih pintar ketika Anda memberi mereka lebih banyak konteks.
jw013

Setelah membalas seruan apresiasi yang berlebihan, izinkan saya mengatakan bahwa autocd memang jawaban yang tepat: D
Luc

The autocdshopt ditambahkan di bash versi 4. Jadi tidak tersedia pada MacOS (yang masih memiliki pesta versi 3.xx) kecuali alternatif, bash baru diinstal (misalnya, melalui homebrew).
Quinn Comendant

2

The utilitas autojump menyediakan mekanisme yang sama dengan daftar direktori yang paling banyak digunakan. Namun, hal ini membutuhkan kebosanan mengetik yang ditambahkan jSpacetetapi ini dikompensasi dengan menebak dengan benar lebih sering daripada tidak.

Ini adalah yang terdekat dengan DWIM yang saya gunakan saat ini.


1

Saya pernah membuat skrip yang berguna untuk tujuan yang sama, dengan fungsi fcd untuk find-n-cd.

Anda mengetik fcd foodan 3 hal dapat terjadi:

  • Tidak ada direktori foo yang ditemukan, kemudian dikembalikan dengan "no such directory " $1
  • Satu file ditemukan: Ini menguji apakah itu adalah direktori (atau hanya file) dan jika demikian, ia ada di sana.
  • Beberapa file ditemukan - maka pilihan disajikan, di mana Anda cukup mengetikkan nomor pilihan (atau nomor khusus untuk pengembalian).

Mirip dengan itu tidak perlu Anda mengetikkan seluruh path, tetapi Anda telah memanggil fungsi secara eksplisit.

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

Anda harus sourcemenggunakan fungsi ( source fcd.sh| . fcd.sh) dan tidak dapat menyebutnya sebagai skrip, karena cdakankah hanya terjadi dalam konteks skrip, dan setelah selesai Anda akan segera kembali ke dir mulai Anda.

Karena ini bekerja dengan locate, itu cukup cepat dalam menemukan direktori (tetapi tidak selalu up to date).

Itu tidak menangani kosong dalam nama direktori dengan anggun. Jika Anda memiliki solusi yang elegan untuk masalah ini, saya akan senang.


1
Pertanyaannya adalah cdsecara otomatis, tanpa mengetikkan perintah apa pun. Jawaban ini lebih cocok untuk navigasi direktori cepat di terminal .
manatwork

2
@manatwork: Ya, Anda bisa menggabungkan perintah dengan penangan kesalahan bash. Di /etc/bash.bashrcsana, di ubuntu, function command_not_found_handleyang tampak seperti itu bisa dimodifikasi.
pengguna tidak diketahui

Kena kau. Cara ini terdengar jauh lebih baik.
manatwork

@Manatwork: Saya akan melakukannya sendiri, jika saya ingin menggunakannya sendiri. Tetapi jika saya ingin mengubah direktori, saya suka menggunakan perintah pendek, tetapi jika saya salah ketik, saya jarang lupa mengetik 3 atau 4 karakter. Memiliki langkah program ini akan agak mengganggu saya, tetapi menggunakannya secara eksplisit baik-baik saja.
pengguna tidak diketahui

1

Ini juga berfungsi,

cdf name_of_file_or_directory

..given bahwa Anda membuat skrip cdf.sh khusus (di bawah) yang bersumber di shell. Untuk direktori sebagai parameter, skrip ini hanya sampai ke direktori induk untuk direktori yang ditemukan. Tambahkan baris berikut ke .bashrc atau .zshrc Anda, apa pun ..

source ~/bin/cdf.sh 

Dan tambahkan kode ini ke file ~ / bin / cdf.sh yang harus Anda buat dari awal.

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

Jawaban bagus untuk pertanyaan lama. Saya yakin Anda akan menerima lencana untuk menghidupkan kembali pertanyaan lama, dan Selamat Datang di U & L.SE
eyoung100

0

Letakkan ini di ~/.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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.