Как я могу программно определить, в котором файлы в настоящее время открыты, проявляют?

Я открыл файл PDF со средством просмотра документов от GUI. Там какой-либо путь состоит в том, чтобы получить путь этого файла в терминале/сценарии?

6
задан 12 May 2014 в 08:02

3 ответа

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

12
ответ дан 17 November 2019 в 04:38

Другой подход был бы чем-то как

$ 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 withnand ending with.pdfbut it will not print the matchedn'. Результат состоит в том, что только имя файла печатается.

5
ответ дан 17 November 2019 в 04:38

Вы не должны определять даже имя файла 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.

2
ответ дан 17 November 2019 в 04:38

Другие вопросы по тегам:

Похожие вопросы: