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

Tri*_*Tao 0 macos bash shell alias

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

sample.txt 
Run Code Online (Sandbox Code Playgroud)

我想把它移到 ~/work/

我愿意 mv sample.txt work/,它会工作.

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

我有类似的东西(请注意,我mv的别名是默认覆盖保护,不确定是否存在问题):

alias mv='mv -i $@'
alias mvg='mv "$@"; cd !$;'
Run Code Online (Sandbox Code Playgroud)

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

任何帮助将不胜感激!

Tom*_*ech 6

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

mv_cd() { mv "$1" "$2" && cd "$2"; }
Run Code Online (Sandbox Code Playgroud)

用法: mv_cd file dest

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

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

用法: mv_cd file1 file2 ... fileN dest

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

正如评论中所提到的(感谢@chepner),没有必要在函数内部构建一个数组.相反,您可以使用数组切片将最后一个参数与其他参数分开:

mv_cd() { mv "${@:1:$#-1}" "${@: -1}" && cd "${@: -1}"; }
Run Code Online (Sandbox Code Playgroud)

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

  • 你可以跳过数组,只需使用`mv"$ {@:1:$# - 1}""$ {@: - 1}"&& cd"$ {@: - 1}"`. (2认同)