如何获得与ls的相对路径?


8

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

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

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

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


9
使用find代替。
伊格纳西奥·巴斯克斯

Answers:


10

好的,因此,如果您不放弃ls,那么至少要设法摆脱对所有内容都使用反引号的习惯,尤其xargs是在更合适的情况下:

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

您对xargs我的兴趣远胜于后退。但是,出于技术原因,是否有理由偏向于使用此顺序的管道而xargs不是使用反引号,或者这仅是口味问题?
miracle173 2012年

在这种情况下,我们只查看两个文件,但是如果我们要移动数千个文件,则可能会意外地尝试创建一个太长的命令行。
geocar 2012年

另外:如果只有几百个文件,我们可以立即开始工作。对于反引号,我们必须等到整个子命令完成。
geocar 2012年

另外:当您设法养成使用习惯时ls,可以利用xargs -0
geocar 2012年

3

8

您可以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 % .

添加了有关find -printf选项的说明
Gilles Quenot 2012年

1
我很好奇:是否有任何特定的理由使用-f2-而不是-f2作为选择cut?第二个破折号是做什么的?
Francesco Turco

1
当然,弗朗切斯科·特尔科(Francesco Turco)如前所述,man cut如果有多个列,它将一直打印到最后。
吉尔斯·奎诺

编辑POST以使用带空格的文件名。
吉尔斯·奎诺

3

使用ls -rt ~/Downloads/*代替ls -rt ~/Downloads/。在ls -rt ~/Downloads/*参数字符串中,字符串首先由外壳扩展(这称为文件名globlob)。因此,您将获得一个路径列表作为ls -rt命令的参数,然后以您指定的方式对命令进行排序ls。相反,该命令ls -rt ~/Downloads/读取directory的内容~/Downloads/。这是没有目录路径的文件列表。


2

使用zsh:

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

(...)部分称为globbing qualifiers(资格限定符),是NET的杀手级特征之一zsh。每个限定符(通常为单个字符)都允许根据文件的属性(类型,大小,时间...)过滤匹配的条目,更改其扩展顺序,或修改扩展方式。

上面,我们有:

  • . (点):仅选择常规文件(不选择目录,符号链接...)
  • omÓ刻申列表由 odification时间。
  • [1,2]:仅选择前两个条目。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.