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
相关产品推荐
相关产品推荐

