RedHat按指定创建日期移动文件,解决-exec参数缺失报错
修复
-exec参数错误及优化方案 一、修复现有命令的错误
你的find命令报错是因为-exec选项必须以;或+结尾,用来标记执行命令的结束,当前命令缺少这个关键的结尾符。
修复后的命令有两种常用写法:
写法1:逐个处理文件(适合小批量)
find /root/call_log/files23 -type f -newermt 2022-06-01 ! -newermt 2022-06-02 -exec mv {} /archive \;
- 注意
;前必须加反斜杠转义,防止被Shell解析为命令分隔符。 - 该写法会为每个匹配文件单独执行一次
mv,逻辑简单但文件量大时效率偏低。
写法2:批量处理文件(适合大批量)
find /root/call_log/files23 -type f -newermt 2022-06-01 ! -newermt 2022-06-02 -exec mv {} /archive +
+会将所有匹配文件一次性传递给mv,减少进程创建开销,执行效率更高。
二、关于“创建日期”的注意点
你提到按创建日期筛选,但-newermt比较的是文件的修改时间(mtime)。如果需要严格按创建时间筛选,不同系统参数不同:
- Linux(ext4等支持的文件系统):用
-newerBt匹配文件的“出生时间”;若仅能获取元数据变更时间,可使用-newerct - macOS:用
-newerBt匹配文件创建时间
比如Linux下按创建时间筛选的命令示例:
find /root/call_log/files23 -type f -newerBt 2022-06-01 ! -newerBt 2022-06-02 -exec mv {} /archive +
三、更优实现:xargs配合find
对于批量移动场景,xargs是另一种高效方案,尤其适合处理含空格/特殊字符的文件名:
find /root/call_log/files23 -type f -newermt 2022-06-01 ! -newermt 2022-06-02 -print0 | xargs -0 mv -t /archive
-print0和-0确保文件名中的特殊字符被正确解析,避免出错。-t /archive指定mv的目标目录,让xargs传递的所有文件名作为源文件参数。
内容的提问来源于stack exchange,提问作者Sourav Roy
相关产品推荐
相关产品推荐

