查找目录中符合3.0MB大小的最近修改文件——命令是否可行?
你的思路方向是对的,但两次尝试都存在一些细节问题,咱们一步步拆解:
先看第一次尝试的问题
ls -t /home/weather/some.cool*.file | head -n +1 | grep "3.0M"
- 大小判断太不靠谱:靠
grep匹配3.0M完全依赖ls的输出格式,不同系统或ls配置(比如默认显示3M而非3.0M)会直接失效,甚至如果文件名里碰巧有3.0M还会误匹配。 - 逻辑顺序反了:你先取了最新的文件再判断大小,如果最新的文件不符合3MB要求,哪怕目录里有其他符合条件的文件也会漏掉。应该先筛选出符合大小和文件名的文件,再挑最新的。
- 无匹配时会出问题:如果没有符合文件名的文件,
ls会输出错误信息,可能被后续命令误处理。
再看第二次尝试的问题
find /home/weather/ -maxdepth 1 -type f -name "some.cool*.file" -size 3M -exec ls -t "{}" +; | head -n +1
- 语法错误:
-exec后面用+的话不需要加;,正确写法是-exec ls -t {} +(如果用;的话要写成-exec ls -t {} \;,但这种写法会每个文件单独执行ls,无法整体排序)。 - 大小匹配可能不精确:
find的-size 3M默认匹配的是介于2MB(不含)到3MB(含)之间的文件,如果你要精确匹配3.0MB(310241024=3145728字节),这个条件就不对了。
修正后的正确思路&命令
方案1:用find精准筛选+排序(推荐)
如果要精确匹配3.0MB(二进制字节):
find /home/weather/ -maxdepth 1 -type f -name "some.cool*.file" -size 3145728c -exec ls -t {} + | head -n 1
如果接受近似3MB(即2MB到3MB之间):
find /home/weather/ -maxdepth 1 -type f -name "some.cool*.file" -size 3M -exec ls -t {} + | head -n 1
这个命令的逻辑是:先用find筛选出符合目录、类型、文件名、大小的文件,再传给ls -t按修改时间倒序排序,最后取第一个(最新的)。
方案2:用ls+awk(仅当前目录)
如果确定只查当前目录,也可以用更简洁的写法,同时避免ls格式问题:
ls -lt --block-size=1 /home/weather/some.cool*.file | awk '$5 == 3145728 {print $9; exit}'
--block-size=1让ls以字节显示大小,awk直接匹配字节数是否等于3145728,找到第一个符合条件的就输出文件名并退出。
补充小提示
如果你的“3.0MB”是指十进制的3MB(310001000=3000000字节),GNU find支持用-size 3000000c或者-size 3MB(大写MB表示十进制单位)来匹配。
内容的提问来源于stack exchange,提问作者arnpry
相关产品推荐
相关产品推荐

