我目前正在自学Python,而我正在编写我的第一个shell脚本。它是一个linux文件搜索shell脚本,使用'md5hash'识别重复文件。它仅用于学习目的,而不是用于真实项目。
这是我的代码:
from subprocess import Popen, PIPE
import os
def index(directory):
stack = [directory]
files = []
while stack:
directory = stack.pop()
for file in os.listdir(directory):
fullname = os.path.join(directory, file)
if search_term in fullname:
files.append(fullname)
if os.path.isdir(fullname) and not os.path.islink(fullname):
stack.append(fullname)
return files
from collections import defaultdict
def check(directory):
files = index(directory)
if len(files) < 1:
print("No file(s) meets your search criteria")
else:
print ("List of files that match your criteria:")
for x in files:
print (x)
print ("-----------------------------------------------------------------")
values = []
for x in files:
cmd = ['md5sum', x]
proc = Popen(cmd, stdout=PIPE)
(out, err) = proc.communicate()
a = out.split(' ', 1)
values.append(a[0])
proc.stdout.close()
stat = os.waitpid(proc.pid, 0)
D = defaultdict(list)
for i,item in enumerate(values):
D[item].append(i)
D = {k:v for k,v in D.items() if len(v)>1}
for x in D:
if len(D[x]) > 1:
print ("File", files[D[x][0]], "is same file(s) as:")
for y in range(1, len(D[x])):
print (files[D[x][y]])
search_term = input('Enter a (part of) file name for search:')
a = input('Where to look for a file? (enter full path)')
check(a)
关于代码的问题:
1。我被建议用subprocess.Popen()替换已弃用的os.popen()
然而,我不知道如何做到这一点。我尝试了几个解决方案,我发现这些解决方案已经存在于stackoverflow中,但似乎没有一个解决方案适用于我的情况,并且每个都会产生某种错误。例如,像这样处理它:
from subprocess import Popen, PIPE
...
cmd = ['md5sum', f]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
proc.stdout.close()
stat = os.waitpid(proc.pid, 0)
我收到NameError: global name 'subprocess' is not defined
错误。
我真的迷失了这个,所以提供的任何帮助都表示赞赏。
2。如何使这个程序能够从顶部(根)搜索?
如果我为搜索路径输入“/”,我会得到PermissionError: [Errno 1] Operation not permitted: '/proc/1871/map_files'
我的脚本是否需要sudo特权?
我正在尝试通过互联网学习Python。谢谢你的帮助!
答案 0 :(得分:2)
<强> 1 强>
如果您使用from module import variable
语法,则可以直接访问variable
,在这种情况下:
from subprocess import Popen, PIPE
proc = Popen(cmd, stdout=PIPE)
如果您使用import module
语法,则需要添加模块名称(就像在代码中一样):
import subprocess
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
有关导入的详细信息,建议您使用文章Understanding imports and PYTHONPATH。
2. 文件系统上的某些文件只能以root身份读取,例如/proc/
目录中的某些文件。要阅读它们,您的Python脚本需要root访问权限,例如通过sudo
。