为特定子目录中的所有 .php 文件抓取 Unix

Crawling Unix for All .php Files in Specific Subdirectories

我正在尝试获取遵循这些模式的 unix 服务器上任何子目录中的所有 php 文件:

./*/www/p3/
./*/www/P3/
./*/www/p3[some letters after a variation on p3 and P3]/

.php 文件也可能位于这些文件的其他子目录中。

我尝试了两种不同的方法:

fls = glob.glob('./*/www/[a-z][3]/*')
fls.extend(glob.glob('./*/www/[a-z][3]/*/*'))
fls.extend(glob.glob('./*/www/[a-z][3]/*/*/*'))

这也恰好包含另一个我不想要的目录 ("./*/www/h3" 每个子目录都有)

我也试过这个:

import os
import fnmatch
matches = []
for root, dirnames, filenames in os.walk('./'):
    for filename in fnmatch.filter(filenames, '*.php'):
            matches.append(os.path.join(root, filename))

其中 returns 个子目录中的所有文件是 php 个文件。

这两种方法都是好的开始吗?我应该尝试另一种匹配文件名的方法吗?

正如我所说,您可以使用 glob.globos.walk

选择顶级目录
for top in glob.glob('./*/www/[pP]3*'):
    for root, dirnames, filenames in os.walk(top):
        for filename in fnmatch.filter(filenames, '*.php'):
                matches.append(os.path.join(root, filename))

或者您可以使用 fnmatch 来确保您找到的 php 文件位于所需位置:

for root, dirnames, filenames in os.walk('./'):
    if not fnmatch.fnmatch(root, './*/www/[pP]3*'):
        continue    
    for filename in fnmatch.filter(filenames, '*.php'):
            matches.append(os.path.join(root, filename))

第一种方法比第二种方法需要更少的文件系统操作。