開いているすべてのPDFファイルのフルパス名を取得する方法(zathuraから) - rofiと同様

開いているすべてのPDFファイルのフルパス名を取得する方法(zathuraから) - rofiと同様

私はzathuraビューアで開くすべてのPDFのフルパスを取得しようとしています。を使用すると、完全なrofi -show windowパスを見ることができるので、これが可能であることを知っています。

走ってみました。

ps -p $(pgrep zathura) -o command

ただし、PDFを開くと、現在の場所に応じて名前の一部のみが表示されます。

Vimtexを使用すると、状況がさらに悪化します。この場合、次の内容が表示されます。

zathura -x /usr/bin/nvim --headless -c "VimtexInverseSearch %{line} '%{input}'" --synctex-forward 224:1:/Path/to/part.tex main.pdf

ここで、main.pdfはpart.texと同じ場所にある必要はありません(\includeなどを使用するとこれが起こります)。

利益を得たら、rofiは正しいことをしているのです!

おそらく、main.pdfファイルを見つけるために、part.texファイルの各親ディレクトリ内で再帰的に検索する「複雑な」スクリプトを書くことができます。

ロフィーがどのように作られるかを知っている人はいますか?それとももっと重要なのはどうすればいいですか?


使っています

X11サーバー

Arch Linux、6.2.8-arch1-1

GNUバッシュ、バージョン5.1.16

Luopeのバージョン:1.7.5

Zaturaバージョン0.5.2

みんなありがとうございます。

ベストアンサー1

次のようにしてみてください。

pids=( $(pgrep zathura) )

for p in "${pids[@]}"; do
  mapfile -d '' -t pdfs < <(
    find "/proc/$p/fd/" -lname '*.pdf' -printf '%l\0')

  [ -n "$pdfs" ] && echo "$p: ${pdfs[@]}"
done

まず、$pidsすべてのプロセスのPIDを含む配列()を作成しますzathura

次に、PIDごとに/ proc / PID / fdディレクトリで終わるシンボリックリンクターゲットを見つけ、一致する配列()を作成します.pdf$pdfsどちらもファイル名の区切り文字としてNULをmapfile使用するためfind、すべてのファイル名を正しく処理できます(スペース、改行、シェルメタ文字などの迷惑な文字を含むファイルも含む)。

最後に、$pdfs配列が空でない場合は、PIDと配列を印刷します。例えば

3289895: /home/cas/Manuals/X399 Taichi.pdf
3290171: /home/cas/Manuals/Define R5 Web-manual V1.2_151013.pdf

注:これはポータブルではありません。これはLinuxでのみ機能します(/proc/PID/fd - /proc擬似ファイルシステムはLinux専用です)。


また、注:これは検索またはatril処理時にqpdfview完全に機能しますが、processを検索すると権限エラーが原因で失敗しますzathura

理由はわかりませんが、私のシステムでは、/proc/PID/fd/atrilおよびqpdfview PIDのディレクトリは所有者が所有していますcasが、zathura PIDのfd /ディレクトリはrootが所有し、rootのみを読み取ることができます。

奇妙な。これが私のシステム(Debian Sid)の奇妙な機能なのか、zathuraの奇妙な機能なのかわかりません。

(更新:事実がわかりましたzathura。以下を参照してください。)zathuraおよび/proc/PIDのファイル所有権)

もちろん、私が代わりsudo find ...に走った場合findプロセスの交換

sudoちなみに、root で何でも実行できるように、すでに設定していない限り、root で何でもfind実行できるようにユーザ アカウントを設定しないことをお勧めします。実行に使用できる述語がfindあります。-exec何もない

代わりに、2つのパラメータのみを必要とするラッパースクリプトを作成してください。

  1. PIDと
  2. -lname述語が一致する引数として使用するパターン。

PID引数に数字のみが含まれており、/ proc / PIDディレクトリが属していることを確認してから、ほとんどの場合、$SUDO_USERハードfindコーディングされた引数として実行する必要があります。sudoユーザーがスクリプトを実行できるように設定します。

とにかく、それがsudo使用される方法です。 1つのことだけを行う非常に編集可能な入力チェックを使用して、非常に限られた単一目的のラッパースクリプトを作成することです。ルートで行う作業が少ないほど良いです。

これは非常に独創的な例です。最も小さいという意味です。理論的例えば、使用しないでください慎重なテストもなく、それを「破壊」しようとする真剣な試みもありません。真剣に、この記事を書くのに約2分かかり、信頼できません。これは、このラッパースクリプトが壊れる可能性があるすべての可能な方法を考慮して反論するのに十分な時間ではありません。

#!/bin/bash

# Arguments:
# $1 PID to examine
# $2 pattern to match -lname (symlink target)
#
# Returns NUL-separated list of matching symlink
# targets found in /proc/$1/fd/

[ "$#" -ne 2 ]       || exit 1  # only two args allowed
[[ $1 =~ ^[0-9]+$ ]] || exit 1  # first arg must be numeric

pdir="/proc/$1"

owner=$(stat --printf '%U' "$pdir")     # GNU stat's printf
[ "$owner" = "$SUDO_USER" ]] || exit 1  # owner must match

find "$pdir/fd/" -lname "$2" -printf '%l\0'

もっとクールにしたい場合は、さまざまなエラー条件にさまざまな終了コードを使用できます(find実行時に独自の終了コードもあることを考慮してください)。

おすすめ記事