5

我在 Apache 服务器上有一个目录(Linux/Unix),其中有很多子目录,其中包含很多这样的文件:

- 目录  
  - 2010_01/
    - 142_78596_101_322.pdf
    - 12_10.pdf
    - ...
  - 2010_02/   
    - ...

我怎样才能找到文件名看起来像的所有文件:*_*_*_*.pdf?其中 * 始终是一个数字!!

我尝试像这样解决它:

ls -1Rl 2010-01 | grep -i '\(\d)+[_](\d)+[_](\d)+[_](\d)+[.](pdf)$' | wc -l

但是正则表达式\(\d)+[_](\d)+[_](\d)+[_](\d)+[.](pdf)$不适用于 grep。

编辑1ls -l 2010-03 | grep -E '(\d+_){3}\d+\.pdf' | wc -l :例如尝试仅返回null。所以它不能完美地工作

4

3 回答 3

3

尝试使用find.

满足您的规范的命令__*_*.pdf where * is always a digit

find 2010_10/ -regex '__\d+_\d+\.pdf'

但是,根据您尝试的正则表达式,您似乎想要一个由下划线分隔的 4 个数字序列。

(\d+_){3}\d+\.pdf

或者您想匹配所有仅包含数字/下划线的名称?

[\d_]+\.pdf
于 2012-09-24T14:36:23.440 回答
1

首先,您应该使用 egrep vs grep 或使用 -E 调用 grep 来扩展模式。

所以这对我有用:

$ cat test2.txt
- Dir  
  - 2010_01/
    - 142_78596_101_322.pdf
    - 12_10.pdf
    - ...
  - 2010_02/   
    - ...

现在 egrep 那个文件:

cat test2.txt | egrep '((?:\d+_){3}(?:\d+)\.pdf$)'
- 142_78596_101_322.pdf

由于整个模式周围有括号,因此将捕获整个文件名。

请注意,该模式不适用于传统模式下的 grep:

$ cat test2.txt | grep '((?:\d+_){3}(?:\d+)\.pdf$)'
... no return

但是,如果您使用扩展模式开关(与调用 egrep 相同),则可以:

$ cat test2.txt | grep -E '((?:\d+_){3}(?:\d+)\.pdf$)'
- 142_78596_101_322.pdf 
于 2012-09-24T15:37:31.040 回答
0

感谢gbchaosmasterwolf,我找到了一种适合我的方法:

进入目录

find . | grep -P "(\d+_){3}\d+\.pdf" | wc -l

在根目录

find 20*/ | grep -P "(\d+_){3}\d+\.pdf" | wc -l
于 2012-09-25T08:27:55.270 回答