fehから絶対パスを取得する

fehから絶対パスを取得する

これコマンドを使用すると、フォルダ内の画像を繰り返し表示できます。

feh --recursive --auto-zoom

画像を表示するときに、カスタムコマンドをキーボードの0〜9キーに関連付けることもできます。たとえば、端末に表示されている画像のファイル名を端末に出力させるには、画像が表示されている間に0キーを押して、feh次の引数を使用して実行します。--action

feh --recursive --auto-zoom --action "echo '%f'"

--actionコマンドをecho '%f'ゼロキーにバインドします。%f出力時は以下のような相対パスです./filename.jpg

fehただし、相対パスの代わりに絶対パスを指定する必要があります。したがって、その点を切り取り、残りの内容をpwd

私の試みは次のとおりです。

feh --recursive --auto-zoom --cache-size 2048 --action "echo $(pwd)$(echo '%f' | cut -c 2-)}"

ただし、出力は次のようになります。

/absolute/pathf

(pwdの末尾にある「f」に注意してください)

どのようにそのような結果を得ることができますか? :

/absolute/path/filename.jpg

答え1

ただし:

feh --recursive --auto-zoom --action 'printf "%%s\n" %F' "$PWD"

それは:

  • 現在の作業ディレクトリのフルパスをfehfehと同じではありません.)に渡すと、その中にあるファイルのフルパスが提供されます。
  • このように適切に引用する%F代わりに使用してください(文字を含むファイル名が窒息し、任意のコマンド実行の脆弱性になる可能性があります(名前が悪いか、名前が悪いファイルを想像してみてください))。%f'%f''';reboot #.jpg
  • 使用しないでくださいecho。通常、任意のデータを表示するために使用することはできません。
  • %私たちが渡す必要があるテキストはprintfエスケープする必要があります%%(これだけでもファイルサイズが%s拡張されます)。feh
  • 私たちは一重引用符(最強引用符)を使用して、ジョブパラメータをに渡しますfeh。このパラメータのリテラルの意味はですprintf "%%s\n" %F。これは、feh呼び出すshell(/bin/sh)に3つの引数を使用してコードを解釈するように指示します。このコードは構文で正しく参照されたファイルへのパスに変更され、そのファイルは順番に呼び出されます(ほとんどの実装に組み込まれています)。パラメーターとしてファイルの絶対パスを指定します。sh-c%%%%Fshshprintfshprintf%s\n

答え2

こんにちはStéphane、素晴らしい答えに感謝します。

私はfehにいる間、私のお気に入りのターミナルファイルマネージャであるRangerでファイルにタグを付けることができるようにあなたの行を使用しました。これには、次のパラメータを使用しました。

feh -FZd --action 'printf "%%s\n" %F' "$PWD" >> ~/.local/share/ranger/tagged image.jpg

Rangerはテキストファイルの末尾にファイルパスを追加し、マーカー画像を非常に簡単に保存します。イメージのタグを解除すると、対応するファイルパスが削除されます。

しかし、レンジャーのファイルオープナー/実行ライフルに統合する際に問題が発生しました。 Rifleは、本質的にファイルを開くために使用する項目を決定するためにいくつかのファイルタイプチェックを実行するファイルランチャーです。上記の1行のコードを次のようにライフルに追加しました。

mime ^image, has feh,      X, flag f = feh -FZd --action 'printf "%%s\n" %F' "$PWD" >> ~/.local/share/ranger/tagged -- "$@"

フラグ f はプロセスを分岐し、X はグラフィカル環境を使用できることを知らせます。そして無言劇のジャンルがあります。これらのどれも問題を引き起こさない。私の主張を破る部分は$@最後の部分です。

これは、レンジャーに電流を開くように指示するのに役立ちます。集中ディレクトリの先頭から始まるのではなく、ファイルを使用することです。残念ながら、この環境変数をパラメータに追加すると、 ~/.local/share/ranger/tagged ファイルの末尾に完全なファイルパスは追加されず、ファイルのみが追加されます。名前

例えば

この写真:/home/$USER/photos/IMG_20221023_102228_HDR~2.jpg

次のようになります。IMG_20221023_102228_HDR〜2.jpg

なぜこれが起こるのかはわかりませんが、環境変数に関連していることはわかっています$@$@これを削除して置き換えると$1(選択したn番目のファイルを参照)、パラメータは上記のように再び正しく機能します。 feh は、フォーカスされたファイルではなくディレクトリの先頭から始まります。

これをよりよく説明できないので申し訳ありません。これが意味があることを願っています。働きたいです!

PS私はここで質問してはいけないことを知っています。少しの助けを借りれば、これはまだ元の質問と密接に関連しているので、誰かの答えになることができます。

関連情報