-1

所以我正在编写一个 python 脚本,我的目标是使用 lsof 为本地用户列出特定目录(我的主文件夹)下的所有打开文件,并且只输出“uniq”条目。

我的脚本如下所示:

import os, sys, getpass
user = getpass.getuser()
cmd = "lsof -u " + user + " +d ~ | sort | uniq"
os.system(cmd)

这种做我想要它做的事情,它为当前本地用户做 lsof,但它无法专门查看我指定的主目录。相反,它在根目录上执行 lsof 并为用户列出整个文件系统的所有 lsof。但是,当我在没有 的情况下执行相同的命令时,-u user它在主目录中看起来特别明显。我一直在研究为什么会这样,是的,我尝试过使用+d /home/and+d ~/home/而不是仅仅+d ~为了让它工作而没有成功,所以我有点难过。任何建议都会很棒:)

4

2 回答 2

0

手册页

通常,特别声明的列表选项是 ORed - 即,指定 -i 选项而不指定地址,而 -ufoo 选项会生成所有网络文件或属于用户“foo”拥有的进程的文件的列表。

有一些例外,但它们都不适用于您的情况。

所以,-u me +d ~意思是“我打开的所有文件或在我的主目录中。

那你怎么做你想做的事?

-a 选项可用于 AND 选择。例如,指定 -a、-U 和 -ufoo 会生成仅属于用户 ''foo'' 拥有的进程的 UNIX 套接字文件的列表。

在那里扔一个-a

cmd = "lsof -a -u " + user + " +d ~ | sort | uniq"

顺便说一句,一般来说,你真的不想os.system在 Python 中使用,这就是文档特别说明的原因:

subprocess模块提供了更强大的工具来生成新进程并检索其结果;使用该模块优于使用此功能。有关一些有用的秘诀,请参阅文档中的用子流程模块替换旧功能部分。subprocess

真的,为什么在 Python 中使用sortanduniq而不是排序?或者,或者,如果您只想让这个 shell 管道运行,而不是在 Python 中以任何方式处理它,为什么首先使用 Python 而不是 bash?

于 2013-02-13T20:29:05.830 回答
0

lsof 默认使用 OR 将选项连接在一起,尝试将-a标志添加到 AND 它们一起。

于 2013-02-13T20:29:24.507 回答