如何修改Shell脚本实现仅复制指定时间范围含指定字符串的最大日志文件
修改后的Shell代码:仅复制符合条件的最大文件
要实现只复制符合时间范围且包含指定字符串的最大文件,可以在原有筛选逻辑基础上,增加按文件大小排序并取最大值的步骤,具体代码如下:
基础版本(文件名无空格时可用)
find /logpath -type f -newermt "$Start-Time" ! -newermt "$End_Time" -exec grep -l "$string" {} + | xargs -I {} stat -c "%s %n" {} | sort -nr | head -n1 | awk '{print $2}' | xargs -I {} cp {} /destination
安全版本(兼容含空格/特殊字符的文件名)
如果目标文件可能包含空格、特殊字符,建议用null分隔符避免解析错误:
find /logpath -type f -newermt "$Start-Time" ! -newermt "$End_Time" -exec grep -lZ "$string" {} + | xargs -0 stat -c "%s %n" {} | sort -nr | head -n1 | awk '{sub(/^[^ ]+ /, ""); print}' | xargs -I {} cp {} /destination
代码分步说明
find ... -exec grep -l[Z] "$string" {} +:保留原有筛选逻辑,找出指定时间范围内且包含目标字符串的文件;-Z用于输出null分隔的文件名,适配特殊字符场景。xargs -[0] stat -c "%s %n" {}:对每个筛选出的文件,用stat输出文件大小(%s)和完整文件名(%n);-0对应grep -Z的null分隔规则,确保文件名解析准确。sort -nr:按文件大小倒序排序,最大的文件会排在结果第一行。head -n1:只保留排序后的第一行,也就是符合条件的最大文件。awk ...:提取该行中的文件名——基础版本用$2直接取值(无空格时有效);安全版本用sub去掉开头的大小数值部分,确保完整提取含空格的文件名。xargs -I {} cp {} /destination:将最终筛选出的最大文件复制到目标目录。
内容的提问来源于stack exchange,提问作者Tanmay
相关产品推荐
相关产品推荐

