You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSH远程获取指定文件名模式最新文件时遇缓冲区溢出错误

解决SSH执行find组合命令时的缓冲区溢出问题

问题根源

你的原命令存在两个核心问题:

  1. 变量解析位置错误:用单引号包裹SSH命令时,$file_date会被传递到服务器A的Shell中解析,而非在服务器B本地展开。若服务器A未定义该变量,find会匹配所有CDR*开头的文件,输出量过大触发缓冲区溢出。
  2. printf格式的换行处理:原命令中-printf内的换行符在单引号上下文的解析异常,进一步加剧了缓冲区负载。

修复后的命令

改用双引号包裹SSH命令,让$file_date在服务器B本地展开后再传递给服务器A,同时优化时间输出格式提升排序效率:

ssh user@103.11.34.111 "find /data/path -name 'CDR*$file_date' -printf '%T@ %p\n' | sort -rn | head -1 | awk '{print \$2}'"

命令细节:

  • %T@:输出文件修改时间的Unix时间戳(含小数),无需处理日期格式即可直接排序,效率更高。
  • sort -rn:按时间戳逆序排列,最新文件排在首位。
  • awk '{print $2}':提取排序后的目标文件路径。

更高效的替代方案

当目标文件数量极大时,避免使用sort,直接通过find+ls获取最新文件:

ssh user@103.11.34.111 "find /data/path -name 'CDR*$file_date' -type f -exec ls -t {} + | head -1"

说明:

  • -type f:仅匹配文件(排除目录干扰)。
  • ls -t:按修改时间排序,最新文件优先输出。
  • -exec ... +:批量传递文件给ls,比单文件循环的-exec ... \;效率更高。

验证步骤

  1. 在服务器B本地确认变量展开正确:
    echo "CDR*$file_date"
    
    确保输出为预期的CDRYYYYMMDD格式。
  2. 执行修复后的命令,确认无缓冲区溢出报错且能获取指定日期的最新文件。

内容的提问来源于stack exchange,提问作者Tiara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:02:32