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}”
。要点很好,更加简洁。我已经修改了我的答案,把你的建议也包括进去了。谢谢