只需输入目录名称即可cd?


58

我或者20年前在某个地方有这个,或者我梦到了。

基本上:

如果blobblob我得到
blobblob: command not found

很公平。

我想要这样,以便当我的shell遇到这些错误时-找不到命令-它会检查是否存在具有该名称的目录('blobblob'),如果存在,则cd指向该目录。

我确定有某些原因不这样做或谨慎进行。
我只是认为这会很整洁,我想尝试通过找到某个地方(例如这里!)来尝试一下。

我不知道该如何暗示可能要进行的shell编程。

Answers:


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

同样,“自动跳转”是一个有用的工具。安装后,它会记住目录,以便您可以输入j abc;如果您以前曾经访问过abc,请说x / d / f / g / t / abc,那么它将CD到那里!
https://github.com/joelthelion/autojump


1
是的,我shopt -s autocd在命令行上输入了它。现在,我可以开始输入目录名称并使用自动完成功能,然后按return键和shell cd进入目录。非常酷 !
Michael Durrant

6
大。感谢您指出要避免的功能失误。
vonbrand

3
我不使用它- cd键入起来并不难,当您为它们提供更多上下文时,大多数制表符补全机制会更聪明。
jw013 2013年

在消除了对赞赏的过分惊叹之后,我只能说autocd确实是正确的答案:D
Luc

autocd禁用了javascript在bash版本4的溶液中加入因此,它是不提供的MacOS(其仍具有的bash 3.xx版),除非一个替代,较新的bash安装(例如,经由自制)。
Quinn Comendant

2

autojump工具提供了一个使用最频繁的目录列表类似的机制。但是,它确实需要增加键入的乏味,jSpace但这可以通过经常猜对来弥补。

这是我迄今最接近的DWIM


1

我曾经为类似的目的制作了一个有用的脚本,并使用了fcd函数来查找-n-cd。

您键入fcd foo,可能会发生3件事情:

  • 找不到这样的目录foo,然后返回 "no such directory " $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自动执行,而无需键入任何命令。此答案更适合于终端中的快速目录导航
manatwork 2012年

2
@manatwork:可以将命令与bash的错误处理程序结合使用。在/etc/bash.bashrcubuntu中, function command_not_found_handle看起来好像可以对其进行修改。
用户未知

知道了 这样听起来好多了。
manatwork 2012年

@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 2014年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.