检索所有名称以数字开头的文件

检索所有名称以数字开头的文件

可以使用正则表达式方法过滤名称以数字开头的文件

$ find . -iregex "./[1-9]+.+" 

是否可以使用通配符来完成,

故障测试

$ ls {0..9}*
ls: cannot access '1*': No such file or directory
ls: cannot access '2*': No such file or directory
ls: cannot access '3*': No such file or directory
ls: cannot access '5*': No such file or directory
ls: cannot access '6*': No such file or directory
ls: cannot access '7*': No such file or directory
ls: cannot access '8*': No such file or directory

答案1

是的,当然是了。我们以此目录为例:

$ ls
1file  4file  7file  8file fileNoNum

现在,要列出所有以数字开头的文件(或目录),您可以执行以下操作:

$ ls [0-9]*
1file  4file  7file  8file

您使用的 shell 扩展{0-9}*实际上将扩展为:

ls '0*' '1*' '2*' '3*' '4*' '5*' '6*' '7' '8*' '9*'

因此,如果当前目录中的文件的第一个字符不是数字,则会出现错误消息。使用 glob 模式[0-9]可以避免这些错误。

原因是 shell 扩展 ( {x..y}) 由 shell 扩展被传递给你正在调用的程序(ls在本例中)。你可以使用以下命令来查看实际效果set -x

$ set -x
$ ls {0..9}*
+ ls '0*' 1file '2*' '3*' 4file '5*' '6*' 7file 8file '9*'
ls: cannot access '0*': No such file or directory
ls: cannot access '2*': No such file or directory
ls: cannot access '3*': No such file or directory
ls: cannot access '5*': No such file or directory
ls: cannot access '6*': No such file or directory
ls: cannot access '9*': No such file or directory
 1file   4file   7file   8file

如上所示,实际传递给的模式在调用ls之前已扩展为任何匹配的文件。因此,转换为,转换为,转换为和转换为。其余的无法扩展,因为没有匹配的文件名,因此它们被传递给尝试列出与它们匹配的任何文件,但未找到任何文件,并且出现错误。就像您直接运行它们时会发生的情况一样:ls1*1file4*4file7*7file8*8filels

$ ls 9*
ls: cannot access '9*': No such file or directory

将其与 glob 方法进行比较:

$ ls [0-9]*
+ ls 1file 4file 7file 8file
1file  4file  7file  8file

这里,再次,在调用之前扩展了 glob ls,但由于它是一个 glob,因此它仅扩展到匹配的文件名。为了进一步说明这一点,比较一下当您回显 glob 或扩展时会发生什么:

$ echo [0-9]
[0-9]
$ echo {0..9}
0 1 2 3 4 5 6 7 8 9

另外,你的find命令并没有像你想象的那样执行。它将打印出所有文件或目录名称在当前目录中以数字开头的,以及名称以数字开头的任何目录的所有文件和子目录。请参阅:

$ tree
.
├── 1file
├── 1foo
│   └── file
├── file
└── foo
    └── 1file

$ find . -iregex "./[1-9]+.+" 
./1file
./1foo
./1foo/file

-iregex的操作数匹配find整个文件名。所以./foo/1file没有返回,因为./foo不是以数字开头,并且./1foo/file返回,尽管文件名不是以数字开头,但因为文件所在目录的名称确实以数字开头。

要查找此目录或任何子目录中以数字开头的所有文件(且仅限文件),您可以使用:

$ find . -type f -name '[0-9]*'
./1file
./foo/1file

相关内容