如何为点字符串添加别名(例如将'...'更改为'../..')?

如何为点字符串添加别名(例如将'...'更改为'../..')?

我正在尝试使用快捷方式返回几个目录。例如"cd ...." == "cd <number of dots - 1> * '../'"

  1. 我尝试执行 alias '...'='../..' && cd ... 但得到了“没有那个文件或目录”
  2. 然后我尝试做别名'...'='../..'但得到了“无效的别名”
  3. 我想我可以创建一个函数:function bla { for i in $(seq $(($1 - 1))); do cd ../; done; }; bla 3但这似乎不太优雅(而且我一次只使用一个 cd ../,这很糟糕(cd -例如不会产生预期的效果)但我可以连接字符串并只在最后使用 cd)

我的问题是:如何解决(1)和(2),以及有没有更简洁的方法?

答案1

我建议

alias '...'='cd ../..'

有了它,您只需键入...并向上移动两个目录即可(甚至比cd ...!)

你甚至可以制作一整套这样的产品:

alias '..'='cd ..'
alias '...'='cd ../..'
alias '....'='cd ../../..'
alias '.....'='cd ../../../..'

...等等

或者,如果您想跳过所有输入操作,这将创建最多 100 个目录的所有别名:

alias_str=".."
cmd_str="cd .."
for i in $(seq 1 100);
do
    alias ${alias_str}="$cmd_str"
    alias_str="$alias_str."
    cmd_str="$cmd_str/.."
done

答案2

使用这样的函数:

...() { 
  b=".."
  # check that the argument is a number
  if [[ ! "$1" =~ ^[0-9]*$ ]]; then
    echo "Bad argument."
  else
    # if no arguments, or it is 1, just back 1 dir
    if [[ $# -eq 0 || "$1" -eq 1 ]]; then 
      cd ..
    else 
      for i in $(seq 1 "$1"); do
        b+="/.."
      done
      cd "$b"
    fi
  fi
}

因此,您要传递要返回的目录数的参数。例如:

$ cd /home/user/Foo/bar

/home/user/Foo/bar$ ... 2

/home/user/$


相关内容