find命令! -newermt参数无效,如何排除指定日期列文件?
解决find命令排除指定创建日期文件的问题
你的问题出在对-newermt参数的逻辑理解上,直接叠加多个! -newermt会导致筛选条件完全偏离预期。咱们一步步来修正:
核心问题分析
! -newermt "YYYY-MM-DD"的实际含义是文件的修改时间不晚于指定日期的0点,也就是文件时间≤该日期。你之前的命令相当于要求文件同时满足≤2019-09-17、≤2019-08-25、≤2019-05-31、≤2019-06-30,最终只会筛选出早于2019-05-31的文件,这显然和你想要排除特定日期文件的需求不符。
正确的命令写法
要排除恰好创建于某一天的文件,需要先定义该日期的完整时间区间(从当天0点到次日0点),然后排除落在这个区间内的文件。针对你的需求——排除2019-09-18和2019-01-20的文件,命令如下:
find /home/ubuntu/ -maxdepth 1 -type f ! \( -newermt "2019-09-18" ! -newermt "2019-09-19" \) ! \( -newermt "2019-01-20" ! -newermt "2019-01-21" \)
命令细节解释
-newermt "2019-09-18" ! -newermt "2019-09-19":匹配修改时间在2019-09-18 00:00:00到2019-09-19 00:00:00之间的文件,也就是当天创建/修改的文件。! \( ... \):对括号内的条件取反,也就是排除这个区间内的文件(括号是为了保证逻辑优先级,避免条件混乱)。- 两个
! \( ... \)用find默认的逻辑与连接,就会同时排除9月18日和1月20日的文件。
验证你的示例文件
针对你给出的示例文件:
- 1.txt(2019-09-18):会被第一个
! \( ... \)条件排除 - 2.txt(2019-09-17):不在任何排除区间内,会被正常列出
- 3.txt(2019-05-19):不在任何排除区间内,会被正常列出
- 4.txt(2019-01-20):会被第二个
! \( ... \)条件排除
最终输出正好是你期望的2.txt和3.txt。
额外注意
如果你的系统和文件系统支持**文件创建时间(birth time)**而非修改时间,可以把-newermt换成-newerBt(部分Linux发行版需要ext4等支持创建时间的文件系统),命令逻辑完全一致。
内容的提问来源于stack exchange,提问作者vivek
相关产品推荐
相关产品推荐

