所以我在tmp目录中有以下文件:
file.0
file.1
file.t9
file.22
file.4444
如果我只想列出以'.digits'(0,1,22,4444)结尾的文件而不是(t9),我可以尝试使用这样的通配符:
ls tmp/file.{[0-9],[0-9][0-9],[0-9][0-9][0-9],[0-9][0-9][0-9][0-9]}
然而,我得到以下结果的丑陋错误
ls: cannot access tmp/file.[0-9][0-9][0-9][0-9]: No such file or directory
file.0
file.1
file.22
file.4444
我也尝试使用{0..999},但这也会导致相同类型的错误(以及更多错误)。 如何做到这一点的线索没有专家的错误?
答案 0 :(得分:11)
至少在bash 4中,启用extglob
shell选项时:
shopt -s extglob
ls /tmp/file.+([0-9])
模式+([0-9])
匹配一个或多个数字。
您可以在man bash
的模式匹配部分详细了解此信息。
<强>更新强>
实际上,正如@chepner所指出的那样,自extglob
版本在2.02版本中引入以来,这应该适用于您今天遇到的几乎所有bash
,除非您将发行版从岩石或东西。
答案 1 :(得分:1)
您可以使用ls
列出所有文件,然后通过grep
过滤其输出:
ls -1 | grep -E '\.[0-9]+$'
按照以下测试:
pax> printf 'file.0\nfile.1\nfile.t9\nfile.22\nfile.4444\n' | grep -E '\.[0-9]+$'
file.0
file.1
file.22
file.4444
-E
为您提供扩展的正则表达式,以便+
修饰符起作用。如果您无法使用,则可以使用\.[0-9][0-9]*$
正则表达式。
答案 2 :(得分:0)
过滤特定扩展名文件的另一种变体是使用带有一组谓词的find
命令:
find tmp/ -type f -iregex '^.*\.[0-9]+$'
-type
谓词仅匹配文件,-iregex
匹配以一个或多个数字结尾的名称 - 忽略名称的大小写。如果您要过滤以file
开头的文件,请改用以下内容:
find tmp/ -type f -iregex '^.*/file\.[0-9]+$'
最后,如果您不希望为每个生成的文件显示整个路径,请使用以下命令:
find tmp/ -type f -iregex '^.*/file\.[0-9]+$' -printf "%f\n"
答案 3 :(得分:0)
另一个防止看到(即隐藏)“丑陋错误”的简单方法是通过附加/dev/null
将标准错误重定向到2> /dev/null
。在您的示例中:
ls tmp/file.{[0-9],[0-9][0-9],[0-9][0-9][0-9],[0-9][0-9][0-9][0-9]} 2> /dev/null
这将为您提供所需的结果并隐藏任何错误。与任何将输出发送到stdout并将错误发送到stderr的linux命令或可执行文件一起使用。请注意,这不会影响命令返回状态($?
),只会抑制错误。