for ip in $(pgrep -x evince); do lsof -F +p $ip|grep -i '^n.*\.pdf$'|sed s/^n//g; done
Explicação:
Document Viewer
é o nome amigável do programa /usr/bin/evince
. Então, primeiro precisamos encontrar o ID do processo (PID) de evince
:
$ pgrep -x evince
22291
Para listar todos os arquivos abertos por este PID, usaremos o comando lsof
(note que precisaremos repetir isso para cada PID, caso tenhamos mais de uma instância do evince em execução)
$ lsof -F +p 22291
some other files opened
.
.
.
n/home/c0rp/File.pdf
Em seguida, vamos apenas para os pdfs e descartar o n irrelevante no início da linha:
$ lsof -Fn +p 22291 | grep -i '^n.*\.pdf$' | sed s/^n//g
/home/c0rp/File.pdf
Finalmente, para combinar tudo em uma linha bash:
for ip in $(pgrep -x evince); do lsof -F +p $ip|grep -i '^n.*\.pdf$'|sed s/^n//g; done
Este one-liner foi inspirado na resposta de Terdon, que também é muito interessante na maneira como resolve o mesmo problema.
Se você estiver interessado no que n em lsof -Fn
, aqui estão as citações de man lsof
sobre a opção -F
:
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
...
...
então -Fn
, está dizendo: mostre-me file name, comment, Internet address