简短回答:
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):
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)
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))
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
中查找这些文件,并试图猜测这些文件的不寻常之处。它们是指向目录的符号链接(而不是文件)。