I have opened a PDF file with the document viewer from the GUI. Is there any way to get the path of this file in a terminal/script?
I have opened a PDF file with the document viewer from the GUI. Is there any way to get the path of this file in a terminal/script?
TLDR:
for ip in $(pgrep -x evince); do lsof -F +p $ip|grep -i '^n.*.pdf$'|sed s/^n//g; done
Explanation:
Document Viewer
is the friendly name for the program /usr/bin/evince
. So first we need to find the process ID (PID) of evince
:
$ pgrep -x evince
22291
To list all files opened by this PID we will use the lsof
command (note that we'll need to repeat this for every PID in case we have more than one instance of evince running)
$ lsof -F +p 22291
some other files opened
.
.
.
n/home/c0rp/File.pdf
Next we'll grep only for pdfs and discard the irrelevant n at start of line:
$ lsof -Fn +p 22291 | grep -i '^n.*.pdf$' | sed s/^n//g
/home/c0rp/File.pdf
Finally to combine everything in one bash line:
for ip in $(pgrep -x evince); do lsof -F +p $ip|grep -i '^n.*.pdf$'|sed s/^n//g; done
This one-liner was inspired from the answer of terdon which is also very interesting in the way it solves the same problem.
If you are interested in what n in lsof -Fn
is for, here is quote from man lsof
about the -F
option:
OUTPUT FOR OTHER PROGRAMS
When the -F option is specified, lsof produces output that is suitable
for processing by another program - e.g, an awk or Perl script, or a C
program.
...
...
These are the fields that lsof will produce. The single character
listed first is the field identifier.
...
...
n file name, comment, Internet address
...
...
so -Fn
, is saying show me file name, comment, Internet address