Thursday, April 25, 2024
13
rated 0 times [  13] [ 0]  / answers: 1 / hits: 1461  / 1 Year ago, mon, february 6, 2023, 4:18:07

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?


More From » command-line

 Answers
1

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


[#25298] Tuesday, February 7, 2023, 1 Year  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
assionortly

Total Points: 423
Total Questions: 121
Total Answers: 115

Location: Chad
Member since Wed, Sep 30, 2020
4 Years ago
;