python - 使用一个列表迭代并组合对象以使用python查找具有两个扩展名的文件
问题描述
我想将可能的扩展列表迭代到两个变量中以查找所有可能的匹配项。
使用 bash,这将部分实现,如下所示:
while read ext; do
find $DIR -type f -name "*.$ext.*"
done < extensions.txt
while read ext; do
find $DIR -type f -name "*.*.$ext"
done < extensions.txt
其中extensions.txt
包含:
phar
php
pl
py
cgi
asp
js
html
htm
phtml
txt
gif
但我想要实现的是只组合这一个列表的扩展。例如,我想查找类似filename.php.txt
orfilename.html.gif
而不是任何类型的filename.random.extension
文件,因为这会输出太多文件。
有人可以帮忙吗?
到目前为止我已经尝试过的说明
我将一个文件放在一个/some/www/path/html/
名为filename.php.txt
我运行以下脚本的目录中
#!/usr/bin/python
from glob import glob
with open('/root/scan-files/extensions.txt', 'r') as f:
exts = f.readlines()
for file in glob("/some/www/path/html/*.*.*"):
if all(i in exts for i in file.split('.')[1:]):
print(file)
并且没有输出。它应该filename.php.txt
在那个路径中找到了。
尝试调试:
python -m pdb find-malicious-extensions.py
> /root/scan-files/find-malicious-extensions.py(3)<module>()
-> from glob import glob
(Pdb) n
> /root/scan-files/find-malicious-extensions.py(5)<module>()
-> with open('/root/scan-files/extensions.txt', 'r') as f:
(Pdb) n
> /root/scan-files/find-malicious-extensions.py(6)<module>()
-> exts = f.readlines()
(Pdb) n
> /root/scan-files/find-malicious-extensions.py(8)<module>()
-> for file in glob("/some/www/path/html/*.*.*"):
(Pdb) n
> /root/scan-files/find-malicious-extensions.py(9)<module>()
-> if all(i in exts for i in file.split('.')[1:]):
(Pdb) n
> /root/scan-files/find-malicious-extensions.py(8)<module>()
-> for file in glob("/some/www/path/html/*.*.*"):
(Pdb) n
--Return--
> /root/scan-files/find-malicious-extensions.py(8)<module>()->None
-> for file in glob("/some/www/path/html/*.*.*"):
(Pdb) n
--Return--
> <string>(1)<module>()->None
(Pdb) n
The program finished and will be restarted
有什么想法会出错吗?
解决方案
from glob import glob
with open('extensions.txt', 'r') as f:
exts = f.readlines()
for file in glob("*.*.*"):
if all(i in exts for i in file.split('.')[1:]):
print(file)
分解它:
glob
从glob
模块中导入方法:
from glob import glob
- 打开
extensions.txt
文件并将所有扩展名存储在列表中:
with open('extensions.txt', 'r') as f:
exts = f.readlines()
- 遍历当前目录中名称中至少包含 2 个点的所有文件:
for file in glob("*.*.*"):
- 用一个点分割每个文件的名称,并检查除第一个字符串之外的所有字符串是否都在有效扩展名中。如果是这样,请打印文件名:
if all(i in exts for i in file.split('.')[1:]):
print(file)
推荐阅读
- swift - 如何使用单独的视图控制器从弹出视图更新 UIlabel
- ajax - 我想使用 PUT 方法来更新我的数据库中的变量。每次单击按钮时,我都需要更新该变量
- google-analytics - Samesite 属性调整 - AdWords 和分析 Cookie
- c - 有什么方法可以使用 strtof() 来转换“负数”?
- reactjs - Redux-saga store 将自定义类转换为普通对象
- python - 如何访问嵌套函数中的实例?
- excel - 使用从文本文件导入的范围创建表
- postgresql - 如何使用我的默认 Windows 用户名连接到 PostgreSQL
- spring-batch - 批处理作业失败时如何将任务的退出代码设置为非零值?
- sql - 根据每个唯一标识符的条件更新值