简短的回答:
ls -laR | grep "^[-l]"
计算目录的符号链接。它匹配任何以目录开头l
并包含符号链接的行。
相反,[files for root, dirs, files in os.walk('/etc')]
不计入目录的符号链接。它忽略所有目录并仅列出文件。
长答案:
以下是我识别差异的方法:
import os
import subprocess
import itertools
def line_to_filename(line):
# This assumes that filenames have no spaces, which is a false assumption
# Ex: /etc/NetworkManager/system-connections/Wired connection 1
idx = line.rfind('->')
if idx > -1:
return line[:idx].split()[-1]
else:
return line.split()[-1]
line_to_filename
尝试在ls -laR
.
这定义expr1
并且expr2
本质上与您的代码相同。
proc=subprocess.Popen(
"ls /etc -alR 2>/dev/null | grep -s \"^[-l]\" ", shell = True,
stdout = subprocess.PIPE) #Expr1
out, err = proc.communicate()
expr1 = map(line_to_filename, out.splitlines())
expr2 = list(itertools.chain.from_iterable(
files for root,dirs,files in os.walk('/etc') if files)) #Expr2
for expr in ('expr1', 'expr2'):
print '{e} is of length {l}'.format(e = expr, l = len(vars()[expr]))
这会从中删除名称expr1
也位于expr2
:
for name in expr2:
try:
expr1.remove(name)
except ValueError:
print('{n} is not in expr1'.format(n = name))
删除共同共享的文件名后expr1
,expr2
print(expr1)
产量
['i386-linux-gnu_xorg_extra_modules', 'nvctrl_include', 'template-dkms-mkdsc', 'run', '1', 'conf.d', 'conf.d']
然后我过去常常find
在其中找到这些文件,/etc
并试图猜测这些文件有什么不寻常之处。它们是目录(而不是文件)的符号链接。