我想使用 bash 命令从目录中移动最后修改的 3 个文件。但是,我注意到我可以使用find
以下方式:
find . -type f -mtime -0.5 -print -exec mv {} /home/user/Desktop \;
但我还没搞清楚如何用 做同样的事情ls -tr | tail -n 3
。例如,这不起作用:
ls -tr | tail -n 3 -exec mv {} /home/user/Desktop
tail: invalid option -- 'e'
我更喜欢使用第二个选项的唯一原因是指定文件数量而不是大致时间。是否可以让它ls
与tail
谢谢!
答案1
您正在寻找的命令是xargs
,因为tail
它不具备执行程序的本机能力。
完整命令如下:
ls -tr | tail -n 3 | xargs -I{} mv {} /home/user/Desktop
具体来说:
ls -tr
按修改日期/时间 ( ) 排序列出文件-t
。默认情况下,最新的文件排在最前面;如果添加 ,则顺序将反转(最近修改的文件排在最后)-r
。tail -n 3
将其过滤为最后三个条目。xargs -I{} mv {} /home/user/Desktop
mv {} /home/user/Desktop
对从 收到的每一行运行tail
。请注意,{}
被 的输出替换tail
。
请注意,您可能需要在调用中转义花括号xargs
。
xargs -I\{\} mv \{\} /home/user/Desktop
答案2
根据文件的名称,依赖于输出的解决方案ls
可能会有问题。使用 zsh,可以依靠通配符来完成工作:
mv *(.om[1,3]) ${somewhere}
“魔法”就在*
:后面的两个括号之间
.
仅选择纯文本文件;om
根据 mtime 对 glob 的结果进行排序;[1,3]
选择前三个结果
我知道这个问题专门要求使用 bash 解决方案,因此严格来说,这个答案不符合要求。尽管如此,我还是将它发布给可能有类似任务并可以使用其他 shell 的其他人。