Я открыл файл PDF со средством просмотра документов от GUI. Там какой-либо путь состоит в том, чтобы получить путь этого файла в терминале/сценарии?
TLDR:
for ip in $(pgrep -x evince); do lsof -F +p $ip|grep -i '^n.*\.pdf$'|sed s/^n//g; done
Объяснение:
Document Viewer
дружественное название программы /usr/bin/evince
. Таким образом, сначала мы должны найти идентификатор процесса (PID) evince
:
$ pgrep -x evince
22291
Для списка всех файлов, открытых этим PID, мы будем использовать lsof
команда (отмечают, что мы должны будем повторить это для каждого PID в случае, если у нас есть больше чем один экземпляр, проявляет выполнение),
$ lsof -F +p 22291
some other files opened
.
.
.
n/home/c0rp/File.pdf
Затем мы будем grep только для pdfs и отбрасывать несоответствующий n в начале строки:
$ lsof -Fn +p 22291 | grep -i '^n.*\.pdf$' | sed s/^n//g
/home/c0rp/File.pdf
Наконец объединить все в одной строке удара:
for ip in $(pgrep -x evince); do lsof -F +p $ip|grep -i '^n.*\.pdf$'|sed s/^n//g; done
Эта острота была вдохновлена ответом terdon, который также очень интересен в способе, которым это решает ту же проблему.
Если Вы интересуетесь какой n в lsof -Fn
для, вот кавычка от man lsof
о -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
...
...
так -Fn
, говорит показывают мне file name, comment, Internet address
Другой подход был бы чем-то как
$ for ip in $(pgrep -x evince); do lsof -F +p $ip | grep -oP '^n\K.*\.pdf$'; done
/home/terdon/file1.pdf
/home/terdon/file2.pdf
В целом, каждый раз, когда Вы хотите искать fro процесс, pgrep
лучше, чем ps -ef | grep process
так как последний будет также соответствовать grep
обработайте себя. Например:
$ ps -ef | grep emacs
terdon 6647 6424 23 16:26 pts/14 00:00:02 emacs
terdon 6813 6424 0 16:26 pts/14 00:00:00 grep --color emacs
$ pgrep emacs
6647
-x
опция возвращает только процессы, все имя которых соответствует переданной строке. Это необходимо потому что evince
также запускает демона (evinced
) и это будет также подобрано без -x
( -l
должен распечатать имя, а также PID):
$ pgrep -l evince
4606 evince
4611 evinced
4613 evince
$ pgrep -lx evince
4606 evince
4613 evince
Так, для цикла будет работать lsof
на каждом из PIDs, возвращенных pgrep
. Через них затем проходят grep
. -o
средства опции "печатают только подобранную часть строки" и -P
активирует Perl Совместимые Регулярные выражения, который позволяет нам использовать \K
. В PCREs, \K
означает "отбрасывание все подобранное перед \K ". In other words, since I am using
- o, it will match lines beginning with
nand ending with
.pdfbut it will not print the matched
n'. Результат состоит в том, что только имя файла печатается.
Вы не должны определять даже имя файла PDF, открытого через Средство просмотра документов. Это ниже команды отобразит пути всех файлов PDF, открытых через Средство просмотра документов. evince
фактическая команда для открытия Document Viewer через терминал.
ps -ef | grep evince | sed -n '/.*\.pdf/p' | sed 's/.*evince \(.*\)$/\1/g'
Пример:
$ ps -ef | grep evince | sed -n '/.*\.pdf/p' | sed 's/.*evince \(.*\)$/\1/g'
/media/avinash/C68C57908C5779BF/pdf/PHP/PHP-Manual.pdf
/media/avinash/C68C57908C5779BF/pdf/python.pdf
, Но весь кредит переходит в @Corp.