bash通配符n位数

时间:2013-12-04 06:30:02

标签: linux bash wildcard

所以我在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},但这也会导致相同类型的错误(以及更多错误)。 如何做到这一点的线索没有专家的错误?

4 个答案:

答案 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命令或可执行文件一起使用。请注意,这不会影响命令返回状态($?),只会抑制错误。