我想做这样的事情来移动最后两个下载的文件:
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 可能会意外移动错误的文件/目录)。