我想编写一个脚本,获取所有打开的程序和文件的列表,然后生成一个 shell 脚本来重新打开这些文件。例如,如果我使用 gedit 编辑文件 example.txt,使用 geany 编辑文件 myscript.js,我想生成一个脚本,可以使用它们各自的程序重新打开这两个文件。有没有办法从命令行获取正在运行的程序和文件的列表?
答案1
一般来说,按照你的方法,这是不可能做到的,因为在文本编辑器中打开的文件并不是程序员所说的“打开”的(即“在程序中的某个地方有一个可用于 I/O 操作的活动文件句柄”)。大多数程序所做的是打开文件,读取内存缓冲区中的数据,然后关闭文件。保存文件的过程是一样的——打开、写入、关闭。在打开和保存操作之间,文件不是“打开”的,它只是程序缓冲区中内存数据的副本。
因此,一般不可能确定当前哪些文件已加载到程序的内存中 - 但是,程序本身知道这一点,因此从程序内部实现一个选项来记住关机时打开的文件列表并在启动时重新打开这些文件很简单。许多文本编辑器,例如 Kate 和 Sublime Text 2 都提供了这样的选项。
某些桌面环境,例如 KDE(以及旧版 Gnome,我不确定 Gnome 3/Unity)还提供了在关机时保存正在运行的程序列表并在启动时重新启动这些程序的选项。结合使用好的编辑器,可以实现您想要实现的目标。
答案2
该命令ps aux
将显示正在运行的进程列表。在某些情况下,如果在启动进程时将文件名用作命令行参数,它还将列出正在使用这些程序编辑的文件。例如,我stuff.txt
使用 gedit 打开了文件,并gedit /home/anderson/Desktop/stuff.txt
显示在 的输出中ps aux
。
答案3
gedit
您可以获取今天(在本例中为 2020 年 7 月 1 日)打开的文件列表:
$ grep 2020-07-01 /home/$USER/.local/share/recently-used.xbel
<bookmark href="file:///mnt/e/bin/scpto" added="2020-06-27T00:32:22Z" modified="2020-07-01T20:09:35Z" visited="2020-06-27T00:32:23Z">
<bookmark:application name="gedit" exec="'gedit %u'" modified="2020-07-01T20:09:35Z" count="228"/>
<bookmark href="file:///mnt/e/bin/reset-owner" added="2020-06-30T12:51:15Z" modified="2020-07-01T01:39:20Z" visited="2020-06-30T12:51:15Z">
<bookmark:application name="gedit" exec="'gedit %u'" modified="2020-07-01T01:39:20Z" count="5"/>
然后调用gedit
并将文件名传递给它:
gedit /mnt/e/bin/scpto /mnt/e/bin/scpto
答案4
你可以尝试一个技巧[可能在 gnome 中]
这将显示由某个进程打开的文件[可能当前未使用]
历史文件
/home/$USER/.local/share/recently-used.xbel
可能会对你有帮助。
- 首先复制最近使用过.xbel
- 运行进程并退出[打开文件,关闭它。打开文件,关闭它等等...然后退出]
- 现在比较最近使用过.xbel与旧的最近使用过.xbel
- 从 diff 中提取文件名和相关进程
对于 DEMO,只需复制粘贴即可
diff <(cat ~/.local/share/recently-used.xbel) <(gedit /tmp/2.txt; cat ~/.local/share/recently-used.xbel)
您可以从输出中提取文件名和进程。