2013-02-13 38 views
-1

因此,我正在編寫一個python腳本,我的目標是使用lsof列出本地用戶的特定目錄(我的主文件夾)下的所有打開文件,輸出'uniq'條目。當我指定用戶時,lsof命令沒有在指定的目錄中查找

我的劇本是這樣的:

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

這種做什麼,我想要它做的,它確實LSOF當前本地用戶,但它不能在我指定的主目錄具體看。相反,它在根目錄上執行lsof併爲用戶列出整個文件系統的所有lsof。但是,當我執行相同的命令而沒有-u user時,它特別在主目錄中查找。我一直在尋找爲什麼這是完全的,是的,我已經嘗試使用+d /home/+d ~/home/而不是隻是+d ~得到這個工作沒有成功,所以我有點難住。任何意見將是巨大的:)

+1

你爲什麼期望'+ d/home /'或'+ d〜/ home /'做類似'+ d〜'的事情?通常情況下,'〜'是指'/ home/me',而不僅僅是'/ home',除了'/ home/me'之外,你不可能在'/ home'中打開任何文件。 (請注意,'+ d'不是遞歸的,如果你願意的話,可以使用'+ D')。並且'〜/ home /'將會是'/ home/me/home /',它可能不存在。那麼,你試圖通過嘗試完成什麼? – abarnert 2013-02-13 20:35:10

回答

0

man page

名單通常被明確說明或運算選項 - 即沒有指定的地址和-ufoo選項-i選項生成的列表所有屬於用戶'foo'擁有的進程的網絡文件或文件。

有一些例外,但它們都不適用於您的情況。

所以,-u me +d ~的意思是「由我或我的主目錄打開的所有文件。

所以你怎麼做你想要什麼?

-a選項可用於什麼和。選擇例如,指定-a,-u和-ufoo產生的屬於由用戶擁有的進程「」富「」只有UNIX套接字文件的列表

拋出一個-a在那裏:

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

順便說一句,在一般情況下,你真的不想在Python中使用os.system,這就是爲什麼the documentation特別說:

subprocess模塊產生新的進程,並提供更強大的設備檢索他們的結果;使用該模塊優於使用此功能。請參閱subprocess文檔中的Replacing Older Functions with the subprocess Module部分以獲取一些有用的配方。

真的,爲什麼使用sortuniq而不是在Python中進行排序?或者,如果你只想讓這個shell管道運行,而不是用Python以任何方式處理它,爲什麼首先使用Python而不是bash?

0

lsof默認使用OR將選項連接在一起,嘗試添加-a標誌以將它們與它們結合在一起。