我正在寻找一种很好的可移植方法来查找目录树中与模式匹配的最旧文件,明确不使用find
's-printf
选项。到目前为止,我找到了这个解决方案:https://superuser.com/a/552609/1182477我使用如下模式进行扩展:
find . -type f -name "*.csv" -print0 | xargs -0 ls -ltr | head -n 1
但是,当没有文件与模式匹配时,此操作会默默失败。无论模式如何,我都会得到最旧的文件。到目前为止,我的诊断是:当没有文件与模式匹配时,不会传递任何文件xargs
,因此ls -ltr
会列出所有文件。我该如何解决这个问题?当没有文件与模式匹配时,我希望什么也不会输出。
也许,作为奖励,解决方案还可以避免长文件列表的 ARG_MAX 问题?(在有人问之前:系统上没有 logrotate。)
我在诊断中遇到了一件事,什么可以帮助我找到上述问题的解决方案:
ls *.csv
列出与该模式匹配的文件。但是
*.csv | xargs ls
列出所有文件。它们两个不是应该做同样的事情吗?
非常感谢。
答案1
使用 busybox,只需执行以下操作即可回答您的问题:
find . -type f -name "*.csv" -exec stat -c '%y %n' {} + | sort | head -1
(从最终结果中删除时间戳留给读者作为练习)
这也可以避免使用xargs
基于 的版本时如果文件过多(除非你使用这个技巧)
答案2
因此,感谢 Kapil 的评论,我发现这个有效:
find . -type f -name "*.csv" -print0 | xargs -0r ls -ltr | head -n 1