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

Bash自定义lsd函数按指定日期筛选文件名功能异常问题排查

问题原因及解决方法

第一个问题:写$lsd时返回所有文件名的原因

  • Bash 中调用自定义函数不需要加$前缀,$lsd会被解析为读取名为lsd的变量值,你未定义该变量,因此该行等价于不带任何参数调用 lsd 函数
  • 函数内date=$1拿到的是空值,grep 的匹配规则变为^.\{35\},只要ls -l输出的行前35位有字符就会匹配,相当于匹配所有行,因此返回所有文件名

第二个问题:改为lsd $1后仅匹配日期不匹配月份的原因

  • 你执行命令时传入的参数是带空格的"22 aug",但$1没有加双引号包裹,会被 Shell 默认分词为两个独立参数22和aug
  • 函数lsd仅接收第一个参数22赋值给date,因此 grep 仅匹配第35位开始为22的行,忽略了月份的匹配要求

修复方法

把第8行修改为:

lsd "$1"

双引号会保留参数中的空格,让完整的22 aug传入函数作为匹配规则,即可正常匹配日期和月份。

额外说明

练习册的实现本身是可运行的,但属于比较脆弱的实现:

  • 不同系统的 ls 输出格式、列宽、locale(月份缩写语言)都会影响匹配结果
  • 如果目录下有文件名刚好包含对应日期的行也可能误匹配,生产环境更推荐用find命令按时间筛选,比如find . -maxdepth 1 -newermt "2023-08-22" ! -newermt "2023-08-23" -print

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:15:04