“将文件移动到目录,然后转到该目录”的Bash别名

时间:2014-09-03 16:57:59

标签: macos bash shell alias

所以说我家里有一个档案~/

sample.txt 

我希望将其移至~/work/

我会做mv sample.txt work/它会起作用。

但是,如果我想要一个可以mv文件的别名,然后cd到最后一个arg怎么办?这意味着将文件移动到文件夹,然后自动cd到该文件夹​​。

我有这样的事情(注意我的mv是别名的默认覆盖保护,不确定这是否是问题):

alias mv='mv -i $@'
alias mvg='mv "$@"; cd !$;'

它不起作用(似乎mv并没有得到args)。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:6)

您可以定义一个简单的函数,而不是使用别名:

mv_cd() { mv "$1" "$2" && cd "$2"; }

用法:mv_cd file dest

仅适用于一个文件。要允许多个文件,您可以执行以下操作:

mv_cd() { 
    declare -a files
    while (($# > 1)); do 
        files+=("$1")
        shift
    done
    mv "${files[@]}" "$1" && cd "$1"
}

用法:mv_cd file1 file2 ... fileN dest

这将构建一个包含传递给函数的所有文件名的数组,然后移动它们并更改目录。

comments中所述(感谢@chepner),在函数内部构建数组是不必要的。相反,您可以使用数组切片将最后一个参数与其他参数分开:

mv_cd() { mv "${@:1:$#-1}" "${@: -1}" && cd "${@: -1}"; }

传递给函数的参数位于数组$@中。 ${@:1:$#-1}是从第一个元素到$#-1元素的切片,其中$#是数组的长度。负索引可用于指定数组末尾的范围,因此${@: -1}获取数组的最后一个元素。没有必要指定范围的结束,因为默认情况下它会到达数组的末尾。