-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

マニュアルページから:

通常、明確に記述されたリスト オプションは OR で結合されます。つまり、アドレスなしで -i オプションを指定し、-ufoo オプションを指定すると、すべてのネットワーク ファイルまたはユーザー ''foo'' が所有するプロセスに属するファイルのリストが生成されます。

いくつかの例外がありますが、あなたのケースには当てはまりません。

したがって、-u me +d ~「私が開いたすべてのファイル、またはホームディレクトリにあるすべてのファイル」を意味します。

では、どうやってやりたいことをするのですか?

-a オプションを使用して、選択内容の AND を取ることができます。たとえば、-a、-U、および -ufoo を指定すると、ユーザー ''foo'' が所有するプロセスに属する UNIX ソケット ファイルのみのリストが生成されます。

そこに投げ-aます:

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

ところで、一般的に、os.systemPython で使用することは本当に望まないため、ドキュメントには具体的に次のように記載されています。

このsubprocessモジュールは、新しいプロセスを生成し、その結果を取得するためのより強力な機能を提供します。この関数を使用するよりも、そのモジュールを使用することをお勧めします。役立つレシピについては、ドキュメントの「古い関数をサブプロセス モジュールに置き換える」セクションを参照してください。subprocess

そして、本当にPython でソートの代わりにsortandを使用するのはなぜでしょうか? uniqまたは、代わりに、このシェル パイプラインを実行するだけで、Python で処理する必要がない場合、そもそもなぜ bash の代わりに Python を使用するのでしょうか?

于 2013-02-13T20:29:05.830 に答える
0

lsof は、デフォルトで OR を使用してオプションを結合します-a。AND にフラグを追加してみてください。

于 2013-02-13T20:29:24.507 に答える