LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: Dasn

求一个匹配 shell 通配符的函数

[复制链接]
 楼主| 发表于 2008-1-8 07:47:33 | 显示全部楼层
Post by ly5066113;1804190
那这样好了,ls的时候不写参数,判断交给awk:
ls | awk '/*\.txt/{printf "%s\0" ,$0}'
这样参数和性能的问题就都能解决了。


是否考虑过文件名中可能含有'\n'的情况? 还有awk的pattern与shell相同么?
我个人觉得find更合适一些,可是输出不是很合适。
谢谢你帮忙。
回复 支持 反对

使用道具 举报

发表于 2008-1-8 09:51:00 | 显示全部楼层
刚才看了一下 find 的文档, 考虑到楼主只想匹配一层目录, 这样写出了下面的命令, 输出不会带有引导的目录

  1. find . -maxdepth 1 -min depth 1 -name '*' -printf '%f\0'
复制代码

至于其支持的匹配表达式根据文档来说, 是通过 fnmatch[3] 来实现的, 而 man fnmatch 的说法则是 'which is a shell wildcard pattern', 我不太会用复杂的 bash 表达式, 但是就一般的情况来说, 'a*b' 'a?b' 'a[xyz]b' 这样的简单形式应该都是一样的, 但是像下面两个命令, 结果就不同了

  1. ls {a,b}*
  2. find -name '{a,b}*'
复制代码


楼主不妨给出一些预计采用的匹配样式, 这样也方便大家测试
回复 支持 反对

使用道具 举报

发表于 2008-1-8 10:04:43 | 显示全部楼层
Post by Dasn;1804255
是否考虑过文件名中可能含有'\n'的情况? 还有awk的pattern与shell相同么?
我个人觉得find更合适一些,可是输出不是很合适。
谢谢你帮忙。


的确,文件名中有\n就不行了,但可以变向的解决。比如用ls -l命令,然后再用awk做判断。
find是很耗资源的,而且可移植性并不是很好。起码我的环境(AIX ksh)中-maxdepth这样的参数就不能用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-8 14:41:48 | 显示全部楼层
在BSD 基本系统里没有找到 'find -printf '

考虑 '\n' 似乎比较复杂。对于 ls -l 如果有文件名类似:"hello\n-rw-r--r--  1 root  wheel   0 Jan 6 16:34 world", 可能还会有问题。考虑移植,ls -l 的输出格式有标准么?

这个问题先放一放吧。Vim 还不支持'\n'的文件名。谢谢各位的回复。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表