Macos 用于';将文件移动到某个目录,然后转到该目录';

Macos 用于';将文件移动到某个目录,然后转到该目录';,macos,bash,shell,alias,Macos,Bash,Shell,Alias,假设我在我的主目录中有一个文件~/: sample.txt 我想把它移到~/work/ 我会做mv sample.txt工作/,它会工作的 但是,如果我想要一个别名,它将mv文件,然后cd到最后一个arg呢?这意味着将文件移动到一个文件夹,然后自动将cd放入该文件夹 我有类似的东西(请注意,我的mv带有别名,用于默认覆盖保护,不确定这是否是问题所在): 它不起作用(似乎mv没有获得args) 任何帮助都将不胜感激 您可以定义一个简单的函数,而不是使用别名: mv_cd() { mv "$1"

假设我在我的主目录中有一个文件
~/

sample.txt 
我想把它移到
~/work/

我会做
mv sample.txt工作/
,它会工作的

但是,如果我想要一个别名,它将mv文件,然后cd到最后一个arg呢?这意味着将文件移动到一个文件夹,然后自动将cd放入该文件夹

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

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


任何帮助都将不胜感激

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

mv_cd() { mv "$1" "$2" && cd "$2"; }
用法:
mv\u cd file dest

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

mv_cd() { 
    declare -a files
    while (($# > 1)); do 
        files+=("$1")
        shift
    done
    mv "${files[@]}" "$1" && cd "$1"
}
用法:
mv\u cd文件1文件2。。。文件目的地

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

正如(感谢@chepner)中所提到的,在函数中不需要构建数组。相反,可以使用数组切片将最后一个参数与其他参数分开:

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

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

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

mv_cd() { mv "$1" "$2" && cd "$2"; }
用法:
mv\u cd file dest

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

mv_cd() { 
    declare -a files
    while (($# > 1)); do 
        files+=("$1")
        shift
    done
    mv "${files[@]}" "$1" && cd "$1"
}
用法:
mv\u cd文件1文件2。。。文件目的地

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

正如(感谢@chepner)中所提到的,在函数中不需要构建数组。相反,可以使用数组切片将最后一个参数与其他参数分开:

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

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

您可以跳过数组,只需使用
mv“${@:1:$}”、${@:-1}”和&cd“${@:-1}”
即可。要点很好,更简洁。我已经修改了我的答案,把你的建议也包括进去了。谢谢。您可以跳过数组,只需使用
mv“${:1:${-1}”“${@:-1}”和&cd“${@:-1}”
。要点很好,更加简洁。我已经修改了我的答案,把你的建议也包括进去了。谢谢