检索所有打开的 pdf 文件的名称(明显或其他)

检索所有打开的 pdf 文件的名称(明显或其他)

我经常打开许多 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

相关内容