在 mac os(使用 zsh)上,我经常发现必须将最后下载的文件复制到当前目录。
已经定义函数 lastn 如下:
function lastn() {
if [ $# -eq 0 ]
then
echo ""
echo "Usage:"
echo "lastn <path> [n]"
echo ""
fi
if [ $# -eq 1 ]
then
ls -lht $argv[1] | head -10
else
ls -lht $argv[1] | head -$argv[2]
fi
}
我已经尝试过这些脚本:
{echo "~/Downloads"; lastn ~/Downloads 2 | tail -1 | sed 's/.* //';} | tr "\n" "/" | sed 's/\/$//' | xargs -I % mv % ./
ORIGIN=$({echo "~/Downloads"; lastn ~/Downloads 2 | tail -1 | sed 's/.* //';} | tr "\n" "/" | sed 's/\/$//'); mv $ORIGIN ./
在这两种情况下,我总是会收到以下类型的错误:
mv: rename ~/Downloads/filename to ./filename: No such file or directory
另一方面,如果我只是复制两个脚本第一部分的输出:
{echo "~/Downloads"; lastn ~/Downloads 2 | tail -1 | sed 's/.* //';} | tr "\n" "/" | sed 's/\/$//'
并将其粘贴为 mv 的第一个参数,按原样使用,命令按预期工作。
我在这里做错了什么?
答案1
您不需要使用绝对路径。您只需像这样重写您的函数:
lastn() {
# Reset all options to safe defaults for this function only.
emulate -LR zsh -o noshortloops -o warncreateglobal -o extendedglob
# Get files sorted by modification date (or failing that, an empty array).
local -a files=( $1/*(Nom) )
case $# in
0)
echo "Usage:"
echo "lastn <path> [n]"
return 1
;;
1)
reply=( $files[1] )
;;
*)
reply=( $files[1,$2] )
;;
esac
# This is not necessary, but gives the user something to look at.
echo $reply
# Report success only when we actually have something to return.
(( $#reply > 0 ))
}
然后您只需执行以下操作即可:
lastn ~/Downloads 2 && mv $reply .
该函数的最后一行使得如果我们没有得到任何结果,那么后面的命令&&
就不会被执行。