可以使用正则表达式方法过滤名称以数字开头的文件
$ 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
之前已扩展为任何匹配的文件。因此,转换为,转换为,转换为和转换为。其余的无法扩展,因为没有匹配的文件名,因此它们被传递给尝试列出与它们匹配的任何文件,但未找到任何文件,并且出现错误。就像您直接运行它们时会发生的情况一样:ls
1*
1file
4*
4file
7*
7file
8*
8file
ls
$ 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