如何用ls获取相对路径?

如何用ls获取相对路径?

我想做这样的事情来移动最后两个下载的文件:

mv ` ls -rt ~/Downloads/ | tail -2 ` .

不幸的是,ls只给出了文件名。我该如何修改上面的代码?

(在有人指出之前,我已经意识到管道输出的问题ls。只有当我知道有问题的文件名时,我才会使用它。)

答案1

好的,所以如果您不放弃ls,那么至少尝试摆脱在所有内容中使用反引号的习惯,尤其是在xargs更合适的情况下:

ls -rtd ~/Downloads/* | tail -n2 | xargs -I{} mv {} .

答案2

你可以find在那里使用 GNU :

mv $(find ~/Download -mindepth 1 -maxdepth 1 -printf '%Ts %p\n' | sort -n | cut -d ' ' -f2- | tail -n 2) .

选项find -printf

  • %Ts将时间显示为时代
  • %p文件路径

man find | less +/'^ *-printf'

编辑

如果您需要处理文件名中的空格,我推荐另一个解决方案:

find -maxdepth 1 -printf '%Ts %p\n' |
    sort -n |
    cut -d ' ' -f2- |
    tail -n 2 |
    xargs -i% mv % .

答案3

使用ls -rt ~/Downloads/*而不是ls -rt ~/Downloads/.在ls -rt ~/Downloads/*参数中,字符串首先由 shell 展开(这称为文件名通配)。因此,您将获得一个路径列表作为该ls -rt命令的参数,然后该命令按照您通过 的选项指定的方式对其进行排序ls。相反,该命令ls -rt ~/Downloads/读取目录的内容~/Downloads/。这是不带目录路径的文件列表。

答案4

使用 zsh:

mv ~/Downloads/*(.om[1,2]) .

(...)部分称为通配限定符,的杀手锏之一zsh。每个限定符(通常是单个字符)允许根据文件的属性(类型、大小、时间...)过滤匹配的条目、更改它们的扩展顺序或修改它们的扩展方式。

上面,我们有:

  • .(点):仅选择常规文件(不选择目录、符号链接...)
  • om对列表进行排序氧化时间。
  • [1,2]:仅选择前两个条目。

另请注意,如果没有匹配项,该命令将失败(其他 shell 可能会意外移动错误的文件/目录)。

相关内容