你如何打击脚本来组合cp和cd或mv和cd

时间:2014-03-30 23:54:17

标签: bash unix

我最近在文件和程序中乱逛并为我的研究做了大量的工作,但是我的bash是如此生疏,我无法想到我将如何做到这一点。例如:

jt ~ $ cp foo.txt arbitrary/folder/destination
jt ~ $ cd arbitrary/folder/destination
jt ~/arbitrary/folder/destination $ //Some command here

这样我就可以成为我复制它的地方。有什么方法可以用别名中的bash正则表达式(或者可能是simipler)来做这个,所以我可以做到

jt ~ $ magic foo.txt arbitrary/folder/destination
jt ~/arbitrary/folder/destination $ ls
foo.txt

这对我很有帮助,我可以学习一些bash

2 个答案:

答案 0 :(得分:5)

使用功能。您可以在.bashrc

中添加以下内容
cpd() {
  cp -- "$1" "$2" || return
  if [[ -d "$2" ]]; then
    cd -- "$2"
  else
    case $2 in
      ?*/*) cd -- "${2%/*}" ;;
      /*) cd / ;;
    esac
  fi
}

...被调用为......

cpd magic.txt arbitrary/directory/destination

cpd magic.txt arbitrary/directory/destination/filename.txt

一项功能是必要的,因为替代方案不会起作用:

  • 外部脚本无法更改其调用者的状态(脚本可以更改自己的工作目录,但不能更改启动它的shell的目录。)
  • 别名无法运行逻辑或条件,也无法引用其位置参数。

答案 1 :(得分:2)

@ Charles脚本的较慢(但较短)的变体

cpd() {
  cp -- "$1" "$2" && [[ -d "$2" ]] && cd -- "$2" || cd -- "$(dirname "$2")"
}