Unix新手求助:如何列出昨日创建的文件?脚本执行失败
解决Unix中列出昨日创建/修改文件的问题
嘿,作为Unix新手,踩这种变量引用和时间字段的坑太正常啦!我来帮你拆解下你的脚本问题,然后给你靠谱的解决方案~
1. 你的脚本为啥没生效?
首先看两个核心问题:
- 变量引用错了:你写的
grep "ydate"和grep "tdate"是在匹配字符串"ydate"和"tdate",而不是你定义的变量$ydate和$tdate的实际日期值!这就是为啥你用grep "$date"(应该是$tdate的笔误吧?)能匹配今日文件,但用"tdate"完全没反应的原因——变量要加$符号才能被解析成实际值。 - 混淆了修改时间和创建时间:
stat -c "%y"输出的是文件的最后修改时间,不是创建时间。Unix/Linux里,文件的创建时间(birth time)并不是所有文件系统都支持(比如老的文件系统就没记录),而且不同系统的stat参数也有差异。
2. 修正后的脚本示例
我分两种情况给你写脚本,按需选择:
情况1:列出昨日修改的文件(兼容性最好)
先统一日期格式,让stat输出和date的格式匹配,再过滤:
# 获取昨日日期(YYYY-MM-DD格式,和stat的日期输出对齐) ydate=$(date -d "-1 day" +"%Y-%m-%d") # 用stat输出修改时间+文件名,再用awk过滤出昨日的文件 stat -c "%y %n" * | awk '$1 == "'"$ydate"'" {print $2}'
情况2:列出昨日创建的文件(仅支持部分文件系统)
先确认你的文件系统支持创建时间:执行stat -c "%w" 某个文件,如果输出不是-,就是支持。然后用下面的脚本:
ydate=$(date -d "-1 day" +"%Y-%m-%d") # 用stat输出创建时间+文件名,过滤昨日的文件 stat -c "%w %n" * | awk '$1 == "'"$ydate"'" {print $2}'
3. 更简单的替代方案:用find命令
其实不用stat+grep这么绕,find命令直接支持按时间筛选,兼容性拉满:
- 找恰好昨日修改的文件(精确到天):
find . -type f -mtime 1
- 找昨日到现在修改的文件(24小时内):
find . -type f -mtime -1 ! -mtime -0
如果要找创建时间(依赖文件系统支持):
find . -type f -birthtime 1
这样是不是省心多啦?
内容的提问来源于stack exchange,提问作者Rashi Goel
相关产品推荐
相关产品推荐

