我有一些以数字为文件名的文件。
10asdfsfl.txt
11sdfkf.txt
20sdfdf.txt
22sdfdf.txt
30saadf.txt
40asdfdf.txt
51sadfsf.txt
62ddgfg.txt
如果我用
ls -l [40-50]*
它返回文件列表
10asdfsfl.txt
11sdfkf.txt
20sdfdf.txt
22sdfdf.txt
30saadf.txt
40asdfdf.txt
51sadfsf.txt
虽然我的期望它应该返回列表
40asdfdf.txt
有什么建议我怎样才能用这个范围文件名得到我想要的结果?
谢谢。
答案1
[]
不适用于数字范围 - 它仅适用于单字符范围(例如 az)。因此,您的[40-50]
被解释为“字符4
或0-5
或0
”,匹配所有文件,其第一的名称的字符在范围内。
数字范围没有直接等效项,但{}
可用于生成一系列通配符(其中一些将不匹配任何内容,因此您可能希望同时使用“nullglob”选项),例如{40..50}*
将扩展为40* 41* ... 50*
。
echo {40..50}xyz
echo {40..50}*
shopt -s nullglob
echo {40..50}*
shopt -u nullglob
如果这是 Bash 并且启用了“extglob”选项,您可以执行@(4[0-9]|50)*
类似正则表达式的“4[0-9] 或 50”......尽管这并不比分别指定两个通配符好多少。
echo 4[0-9]* 50*
shopt -s extglob
echo @(4[0-9]|50)*