'ls' 命令在 Bash - 匹配数字
'ls' command in Bash - Matching numericals
我有一个包含以下文件的目录:
root.o
root.type1
root.type2
root.type1.c
root.type2.c
root.type1.c.pa0
root.type2.c.pa0
root.type2.c.pa1
root.type2.c.pa2
root.type2.c.pa3
....
root.type2.c.pa100
root.type2.c.pa0.out
root.type2.c.pa1.out
root.type2.c.pa2.out
root.type2.c.pa3.out
...
root.type2.c.pa100.out
我想列出以root.type2.c.pa.
开头并以数字结尾的文件,不包括以.out
结尾的文件。换句话说,我想列出这个块:
root.type2.c.pa0
root.type2.c.pa1
root.type2.c.pa2
root.type2.c.pa3
....
root.type2.c.pa100
写 ls root.type2.c.pa?
、ls root.type2.c.pa??
和 ls root.type2.c.pa???
就可以了。
这是在不知道所需文件末尾有多少数字的情况下列出块的简单方法吗?在上面的示例中,我们最多有 3 个数字。实际上,我可能有 1、2、3、4 或 5 个数字。
shopt -s extglob
ls root.type2.c.pa+([0-9])
使用 grep 和正则表达式:
ls |grep -P "root.type2.c.pa[0-9]+$"
试试这个:
ls -1 | grep -oP "root.type2.c.pa\d{1,}"
当命令行包含shell通配符(*
、?
、[...]
)时,ls
列出的文件名列表不是由 ls
决定。 shell 扩展通配符并将匹配的文件名列表传递给 ls
。 ls
仅显示带有或不带有其他详细信息(大小、所有者、权限、日期等)的文件名。
一个可能的解决方案是使用通配符为 ls
编写命令行,其中包括所有必需的文件(可能还有其他文件),然后将输出通过管道传输到 grep
并使用它来过滤只有所需的文件:
ls -1 root.type2.c.pa* | grep '^root\.type2\.c\.pa\d\+$'
工作原理:
ls -1 root.type2.c.pa*
- 列出名称以root.type2.c.pa
开头的所有文件; -1
告诉 ls
在单独的行上显示每个文件名;
grep '^root\.type2\.c\.pa\d\+$'
过滤 ls
的输出,只保留以 root.type2.c.pa
开头且后跟至少一位数字 (\d\+
) 的名称,除此之外别无其他 ($
是行尾)。
我有一个包含以下文件的目录:
root.o
root.type1
root.type2
root.type1.c
root.type2.c
root.type1.c.pa0
root.type2.c.pa0
root.type2.c.pa1
root.type2.c.pa2
root.type2.c.pa3
....
root.type2.c.pa100
root.type2.c.pa0.out
root.type2.c.pa1.out
root.type2.c.pa2.out
root.type2.c.pa3.out
...
root.type2.c.pa100.out
我想列出以root.type2.c.pa.
开头并以数字结尾的文件,不包括以.out
结尾的文件。换句话说,我想列出这个块:
root.type2.c.pa0
root.type2.c.pa1
root.type2.c.pa2
root.type2.c.pa3
....
root.type2.c.pa100
写 ls root.type2.c.pa?
、ls root.type2.c.pa??
和 ls root.type2.c.pa???
就可以了。
这是在不知道所需文件末尾有多少数字的情况下列出块的简单方法吗?在上面的示例中,我们最多有 3 个数字。实际上,我可能有 1、2、3、4 或 5 个数字。
shopt -s extglob
ls root.type2.c.pa+([0-9])
使用 grep 和正则表达式:
ls |grep -P "root.type2.c.pa[0-9]+$"
试试这个:
ls -1 | grep -oP "root.type2.c.pa\d{1,}"
当命令行包含shell通配符(*
、?
、[...]
)时,ls
列出的文件名列表不是由 ls
决定。 shell 扩展通配符并将匹配的文件名列表传递给 ls
。 ls
仅显示带有或不带有其他详细信息(大小、所有者、权限、日期等)的文件名。
一个可能的解决方案是使用通配符为 ls
编写命令行,其中包括所有必需的文件(可能还有其他文件),然后将输出通过管道传输到 grep
并使用它来过滤只有所需的文件:
ls -1 root.type2.c.pa* | grep '^root\.type2\.c\.pa\d\+$'
工作原理:
ls -1 root.type2.c.pa*
- 列出名称以root.type2.c.pa
开头的所有文件;-1
告诉ls
在单独的行上显示每个文件名;grep '^root\.type2\.c\.pa\d\+$'
过滤ls
的输出,只保留以root.type2.c.pa
开头且后跟至少一位数字 (\d\+
) 的名称,除此之外别无其他 ($
是行尾)。