SSH远程获取指定文件名模式最新文件时遇缓冲区溢出错误
解决SSH执行find组合命令时的缓冲区溢出问题
问题根源
你的原命令存在两个核心问题:
- 变量解析位置错误:用单引号包裹SSH命令时,
$file_date会被传递到服务器A的Shell中解析,而非在服务器B本地展开。若服务器A未定义该变量,find会匹配所有CDR*开头的文件,输出量过大触发缓冲区溢出。 - 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 ... \;效率更高。
验证步骤
- 在服务器B本地确认变量展开正确:
确保输出为预期的echo "CDR*$file_date"CDRYYYYMMDD格式。 - 执行修复后的命令,确认无缓冲区溢出报错且能获取指定日期的最新文件。
内容的提问来源于stack exchange,提问作者Tiara
相关产品推荐
相关产品推荐

