使用命令输入的Bash别名

时间:2014-01-17 21:36:21

标签: linux bash

我想创建一个bash别名来执行以下操作:

假设我在以下路径:

/dir1/dir2/dir3/...../dirN

我想直接使用dir3而不使用cd ..。我只想写cdd dir3,它应该直接转到/dir1/dir2/dir3cdd是我的别名。

我写了以下别名,但它不起作用:

alias cdd='export newDir=$1; export myPath=`pwd | sed "s/\/$newDir\/.*/\/$newDir/"`; cd $myPath'

它应该获取当前的完整路径,然后删除新目标目录之后的任何内容,然后cd到这个新路径

我的命令的问题是$1没有得到我对cdd命令的输入

3 个答案:

答案 0 :(得分:2)

这是一个稍微简单的功能,我认为它可以实现你想要做的事情:

cdd() { cd ${PWD/$1*}$1; }

说明:

${PWD/$1*}$1获取当前工作目录并在传递给它的字符串(目标目录)之后剥离所有内容,然后将该字符串添加回来。然后将其用作cd的参数。我没有打扰添加任何错误处理,因为cd将自己负责。

示例:

[atticus:pgl]:~/tmp/a/b/c/d/e/f $ cdd b
[atticus:pgl]:~/tmp/a/b $

这有点难看,但它有效。

答案 1 :(得分:1)

这是一个函数 - 你可以放在你的shell配置文件中 - 它可以做你想要的;请注意,除了目录 names 之外,它还支持级别(例如,cdd 2在层次结构中上升2级);只需使用cdd就可以移动到父目录。

另请注意,匹配是大小写不敏感的。

代码取自“How can I replace a command line argument with tab completion?”,您还可以在其中找到为祖先目录名称添加补充制表符完成的方法。

    cdd () 
    { 
        local dir='../';
        [[ "$1" == '-h' || "$1" == '--help' ]] && { 
            echo -e "usage:
        $FUNCNAME [n]
        $FUNCNAME dirname
      Moves up N levels in the path to the current working directory, 1 by default.
      If DIRNAME is given, it must be the full name of an ancestral directory (case does not matter).
      If there are multiple matches, the one *lowest* in the hierarchy is changed to." && return 0
        };
        if [[ -n "$1" ]]; then
            if [[ $1 =~ ^[0-9]+$ ]]; then
                local strpath=$( printf "%${1}s" );
                dir=${strpath// /$dir};
            else
                if [[ $1 =~ ^/ ]]; then
                    dir=$1;
                else
                    local wdLower=$(echo -n "$PWD" | tr '[:upper:]' '[:lower:]');
                    local tokenLower=$(echo -n "$1" | tr '[:upper:]' '[:lower:]');
                    local newParentDirLower=${wdLower%/$tokenLower/*};
                    [[ "$newParentDirLower" == "$wdLower" ]] && { 
                        echo "$FUNCNAME: No ancestral directory named '$1' found." 1>&2;
                        return 1
                    };
                    local targetDirPathLength=$(( ${#newParentDirLower} + 1 + ${#tokenLower} ));
                    dir=${PWD:0:$targetDirPathLength};
                fi;
            fi;
        fi;
        pushd "$dir" > /dev/null
    }

答案 2 :(得分:1)

我同意mklement0,这应该是一个函数。但是更简单。

将此添加到您的.bashrc

cdd () {
  newDir="${PWD%%$1*}$1"
  if [ ! -d "$newDir" ]; then
    echo "cdd: $1: No such file or directory" >&2
    return 1
  fi
  cd "${newDir}"
}

请注意,如果$1(您的搜索字符串)在路径中出现多次,则此函数将优先选择第一个。另请注意,如果$1是路径的子字符串,则无法找到它。例如:

[ghoti@pc ~]$ mkdir -p /tmp/foo/bar/baz/foo/one
[ghoti@pc ~]$ cd /tmp/foo/bar/baz/foo/one
[ghoti@pc /tmp/foo/bar/baz/foo/one]$ cdd foo
[ghoti@pc /tmp/foo]$ cd -
/tmp/foo/bar/baz/foo/one
[ghoti@pc /tmp/foo/bar/baz/foo/one]$ cdd fo
cdd: fo: No such file or directory

如果您希望通过运行cdd 2来包含上升2级的功能,则可能会有效:

cdd () {
  newDir="${PWD%%$1*}$1"
  if [ "$1" -gt 0 -a "$1" = "${1%%.*}" -a ! -d "$1" ]; then
    newDir=""
    for _ in $(seq 1 $1); do
      newDir="../${newDir}"
    done
    cd $newDir
    return 0
  elif [ ! -d "$newDir" ]; then
    echo "cdd: $1: No such file or directory" >&2
    return 1
  fi
  cd "${newDir}"
}

long if语句验证您是否提供了一个本身不是目录的整数。我们制作了一个新的$newDir,以便您cd -可以根据需要返回原来的位置。