Linux ';ls';Bash中的命令-匹配数字

Linux ';ls';Bash中的命令-匹配数字,linux,bash,ls,Linux,Bash,Ls,我有一个包含以下文件的目录: 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.typ

我有一个包含以下文件的目录:

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个数字。

使用grep和正则表达式:

shopt -s extglob
ls root.type2.c.pa+([0-9])
ls |grep -P "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,}"
试试这个:

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\+
    ),而不保留任何其他名称(
    $
    是行尾)

当命令行包含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\+
    ),而不保留任何其他名称(
    $
    是行尾)

它也匹配文件
something.root.type2.c.pa01
,如果你在管道
ls
,你不需要
-1
,你也不应该解析
ls
的输出。它也匹配文件
something.root.type2.c.pa01
,如果你在管道
ls
,你不需要
-1
,而且无论如何,您都不应该解析
ls
的输出。这还匹配
blah.root.type2.c.pa01等文件,并为名称中有换行符的文件提供断点。这还匹配
blah.root.type2.c.pa01等文件,并为名称中有换行符的文件提供断点。