ディレクトリの名前を入力するだけでcd?


58

私は20年前にこれをどこかに持っていたか、それについて夢見ていました。

基本的に:

タイプがblobblob私が得るなら
blobblob: command not found

けっこうだ。

私のシェルがそれらのエラーを受け取ったとき-コマンドが見つかりません-その名前( 'blobblob')でディレクトリが存在するかどうかを確認し、それがそのディレクトリにあるかどうかを確認しますcd

これを行わない、または慎重に行うにはいくつかの理由があると確信しています。
私はちょうどそれがかなりきれいだと思うだけで、私はそれをどこか(ここのような!)で見つけることによって試してみたいと思います。

これが暗示するかもしれないちょっとしたシェルプログラミングをどうやってやるかわからない。

回答:


76
  • バッシュ: shopt -s autocd
  • Zsh: setopt autocd
  • tcsh: set implicitcd

また、「autojump」は便利なツールです。インストールするとディレクトリが記憶されるので、j abcと入力できます。以前にabcにアクセスしたことがある場合は、x / d / f / g / t / abcと言うとそこに移動します。
https://github.com/joelthelion/autojump


1
うん、私shopt -s autocdはそれが機能するコマンドラインで入力しました。これで、ディレクトリ名の入力を開始し、オートコンプリートを使用して、Returnキーを押して、シェルをcdディレクトリに挿入することができます。とてもクール !
マイケルデュラント

6
すばらしいです。避けるべき不備を指摘してくれてありがとう。
フォンブランド

3
私はこれを使用しません-入力するのcdはそれほど難しくありません、そして、より多くのコンテキストを与えるとき、ほとんどのタブ補完メカニズムはよりスマートです。
jw013

感謝の過度の感嘆符をバックスペースした後、私はちょうどautocdは確かに正しい答えであることを言わせて:D
リュック

autocdshoptは(自作を経て、例えば)新しいバッシュがインストールされている、代替ない限り、(まだbashのバージョン3.xxのを持っている)だから、MacOSで利用できないbashのバージョン4で追加されました。
クインコメンダント

2

autojumpユーティリティは、最も頻繁に使用されるディレクトリのリストと同様のメカニズムを提供します。ただし、タイピングの面倒を追加する必要がありますjSpaceが、頻繁に推測することでこれを補います。

これは、私がこれまでに使用したDWIMに最も近いものです。


1

find-n-cdの関数fcdを使用して、同様の目的で便利なスクリプトを作成したことがあります。

入力するfcd fooと、次の3つのことが起こります。

  • そのようなディレクトリfooが見つからない場合は、 "no such directory " $1
  • 1つのファイルが見つかりました:それがディレクトリ(または単なるファイル)かどうかをテストし、そうであればそこにcdします。
  • 複数のファイルが見つかりました-その後、選択範囲が表示されます。選択範囲の番号(またはリターン用の特別な番号)を入力するだけです。

パス全体を入力する必要はありませんが、関数を明示的に呼び出す必要があるという点で似ています。

#!/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他のスクリプトのみのコンテキストで起こる、そして終了後、すぐに戻ってあなたの出発ディレクトリであることが起こるでしょう。

で動作するためlocate、ディレクトリの検索は非常に高速です(ただし、常に最新とは限りません)。

ディレクトリ名の空白を適切に処理しません。問題のエレガントな解決策があれば、私は幸せです。


1
問題はcd、コマンドを入力せずに自動的に行うことでした。この回答は、ターミナルでのクイックディレクトリナビゲーションにより適しています。
マナトワーク

2
@manatwork:さて、コマンドとbashのエラーハンドラを組み合わせることができます。では/etc/bash.bashrc、Ubuntuの中で、そこにある function command_not_found_handle、それは変更することができているかのように見えました。
ユーザー不明

つかまえた。この方法は、はるかに優れています。
マナトワーク

@manatwork:自分で使いたいのなら、自分でやります。ただし、ディレクトリを変更する場合は短いコマンドを使用しますが、何かを間違えた場合は、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.