是否可以使用 ls、tail 和 mv 移动最后修改的文件?

是否可以使用 ls、tail 和 mv 移动最后修改的文件?

我想使用 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'

我更喜欢使用第二个选项的唯一原因是指定文件数量而不是大致时间。是否可以让它lstail

谢谢!

答案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/Desktopmv {} /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 的其他人。

相关内容