w
を実行すると、ユーザーがviで特定のファイルを編集していることがわかります。
ただし、異なるディレクトリに同じ名前のファイルがいくつかあります。
これらのファイルのうち、ユーザーが編集しているファイルを確認するにはどうすればよいですか?
これはいくつかのケースでうまくいくかもしれません。 ps
を使用して、ファイルを編集しているvi
インスタンスのプロセスIDを見つけることができます。
$ w
...
username pts/2 :0.0 11:42 2:34m 0.28s 0.27s vim foo
$ ps aux | grep 'vim foo'
...
username 55899 .... vim foo
次に、ルートとして、そのpidに関連付けられている開いているファイル記述子を確認します。
# ls -l /proc/55899/fd
...
lrwx------ 1 username group 64 Feb 8 14:23 6 -> /path/to/.foo.swp
その場合、ファイルは/path/to/foo
であると結論付けることができます。
lsof
を使用する必要があります:
$ lsof |grep -i vim
viの内部から、またはシェルからそれを見たいですか? -vimから
<ESC>:ls list buffers opened
Viはできないと思いますが、ctrl+ww
ファイル間を切り替える
-シェルから
lsof | grep -i vi
Rootを持っていないが、ディレクトリを読み取る権限がある場合は、おそらく、問題のファイルの.swp
ファイルを探すことです(ユーザーがvimのデフォルトのスワップ場所を変更していないと仮定します)。 :
$ find . -type f
./1/foo
./0/foo
./2/foo
$ cd 1
$ vi foo
^Z
[1] 19650
$ cd ..
$ find -type f
./1/foo
./1/.foo.swp
./0/foo
./2/foo
ただし、同じディレクトリでfoo
と.foo
を編集する場合、vim
は異なる一時ファイル名拡張子を作成する必要があります。
-rw-r--r-- 1 user grp 12288 Feb 8 14:59 .foo.swo
-rw------- 1 user grp 4096 Feb 8 14:58 .foo.swp
したがって、find . -user username -name '.*.sw*'
を使用して表示することをお勧めします
これは XY問題 -のように少し感じますが、解決しようとしているより大きな問題は何ですか?共通ファイルを編集している複数のユーザーを管理しようとしている場合は、ソース管理システムに移行することをお勧めします。
ユーザーが実行したコマンドはわかっているが、ユーザーが実行したディレクトリを知りたいと想定している(したがって、ユーザーがvi myfile.txt
、それが/home/user/myfile.txt
、または/tmp/myfile.txt
、 または、他の何か)。
その場合、ルートとして実行していると想定すると、次のことができます。
readlink /proc/<pid>/cwd
どこ <pid>
は、関心のあるvi
/vim
プロセスのプロセスIDです。これにより、そのプロセスの現在のディレクトリがわかります。 。
ただし、次のことに注意してください。
:cd
コマンド)。また、100%信頼できるわけではありませんが、エディターを起動したシェルプロセスの現在のディレクトリを確認することもできます。