mv:将 X 重命名为 Y:没有此文件或目录

mv:将 X 重命名为 Y:没有此文件或目录

在 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 .

该函数的最后一行使得如果我们没有得到任何结果,那么后面的命令&&就不会被执行。

相关内容