我经常打开许多 PDF 文件。这些通常使用 chrome 下载并立即使用 evince 打开。
有时我想保留所有打开的 PDF 文件的状态,以便稍后可以重新打开同一组文档。
这主要发生在我需要重新启动以及重新打开同一组文档时,但有时我只是想保留打开文档的列表以供以后使用。
有没有办法从 evince 或任何其他程序获取所有打开的 pdf 文件的名称?或者至少,有没有办法要求 evice 在重新启动后重新打开同一组文档?
答案1
假设您正在查看的 PDF 扩展名为 .pdf,则以下内容可以为您提供打开的 PDF 列表:
$ lsof | grep ".pdf$"
如果您只使用过 Evince,请参阅 Gilles 的类似答案。在我的机器上(打开了一些 pdf)显示输出如下
evince 6267 myuser 14u REG 252,0 363755 7077955 /tmp/SM.pdf
为了获取文件名,我们可以使用awk
:
$ lsof | grep ".pdf$" | awk '{print $9}'
甚至更好,
$ lsof | awk '/.pdf$/ {print $9}'
我们可以将这些结果保存在文件中:
$ lsof | awk '/.pdf$/ {print $9}' > openpdfs
然后,恢复它们:
$ xargs -a openpdfs evince
要自动执行此操作,您可以使用桌面环境提供的任何机制在退出时运行“保存”命令并在登录时运行“打开”命令。通过确保lsof
您的用户打开返回的pdf,可以增加一点稳健性。此方法的优点之一是它适用于任何采用命令行参数的 pdf 查看器。一个缺点是它依赖于文件名;然而,通过一些尝试,了解文件扩展名的要求也可能被删除。
答案2
lsof
列出进程打开的文件。 Evince 确实保持文件打开。如果您是 Linux 下唯一使用 evince 的用户,请按以下步骤查看它正在使用哪些文件:
lsof -p $(pgrep -d, -x evince)
为了自动执行此操作,您需要仅保留 evince 进程的打开的常规文件。这是一个输出文件名的脚本。
lsof -n -d0-9999 -Fpctn | # parseable output, pid/command/type/name, only open files
sed 's/^p/\np/' | # split each process into a paragraph
awk -vRS= '/\ncevince\n/ {print}' | # retain only paragraph(s) with command="evince"
sed 's/^t/\nt/' | # split each file into a paragraph
awk -vRS= '/^tREG\n/ {print substr($0, 7);}' # retain only regular files