以下代码可以找到具有特定文件扩展名的文件。但是相同的代码无法找到具有py扩展名的文件。是什么原因呢?
search.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
def search(dir_or_file):
if dir_or_file.startswith("*."):
return [
os.path.join(i, m)
for i, j, k in os.walk("/")
for m in k
if m.endswith("." + dir_or_file.split(".")[1])
]
else:
return [
os.path.join(i, dir_or_file)
for i, j, k in os.walk("/")
if dir_or_file in k or dir_or_file in j
]
if __name__ == "__main__":
import sys
if len(sys.argv) == 2:
for i in search(sys.argv[1]):
print(i)
当我运行search.py
脚本来搜索扩展名为*.txt
的文件时,我得到以下输出:
tanberk@kutlu:~$ ./search.py *.txt
/media/tanberk/Data/Belgeler/İş Başvurusu/a.txt
/media/tanberk/Data/Projects/astrology/a.txt
/home/tanberk/a.txt
/home/tanberk/Projects/astrology/a.txt
tanberk@kutlu:~$
注意:顺便说一下,许多文件的扩展名为*.txt
。该程序找不到全部。
当我运行search.py
脚本来搜索扩展名为*.py
的文件时,我得到以下输出:
tanberk@kutlu:~$ ./search.py *.py
tanberk@kutlu:~$
答案 0 :(得分:2)
您的shell会在脚本看到之前扩展模式。您会找到所有a.txt
个文件,因为*.txt
从您的主目录扩展到了a.txt
(而且您的主目录中显然没有其他.txt
个文件),因此 real 命令是./search.py a.txt
,您看到的只是名为a.txt
的文件。
一个猜测,您对*.py
看不到任何内容的原因是因为您的主目录中有多个.py
文件,并且如果len(sys.argv)
除了以下内容,您的脚本将明显不执行任何操作2
。当shell展开*.py
时,您将得到一个太长的sys.argv
(因为它实际上运行的是./search.py foo.py search.py ...
之类的东西)而无能为力。
要按预期运行脚本(脚本解释通配符),请引用输入内容以防止shell扩展,例如:
$ ./search.py '*.txt'
我还建议您更改参数处理,以在收到错误数量的参数时生成使用情况消息;使用错误永远都不应默默传递。