从 feh 获取绝对路径

从 feh 获取绝对路径

菲赫命令允许您递归地查看文件夹中的图像:

feh --recursive --auto-zoom

查看图像时,它还允许您将自定义命令与键盘上的 0-9 键关联起来。例如,如果我希望终端输出我正在查看的图像的文件名(到终端),我可以通过在显示图像时按零键来实现这一点,方法是使用如下参数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"

那是:

  • 将当前工作目录的完整路径传递给feh (而不是与feh相同的任何内容.),这样它将为您提供其中文件的完整路径。
  • 使用%F,而不是%f这样正确地完成引用(您'%f'会因包含字符的文件名而窒息',这甚至会使其成为任意命令执行漏洞(想象一下名为或更糟的文件';reboot #.jpg))。
  • 不要使用echo它一般不能用于显示任意数据。
  • %我们需要传递的文字printf必须转义为%%%s单独将扩展feh到文件的大小)。
  • 我们使用单引号(最强引号)将操作参数传递给feh.该参数的字面意思是:printf "%%s\n" %F。这告诉feh调用 shell ( /bin/sh) 来解释带有 3 个参数的代码:sh-c并且该代码已%%更改为%并更改为在语法%F中正确引用的文件的路径,并且 依次将调用(在大多数实现中内置))和文件的完整路径作为参数。shshprintfshprintf%s\n

答案2

您好,Stéphane,感谢您的精彩回答。

我使用了你的单行代码,以便能够在我最喜欢的终端文件管理器 Ranger 中标记文件,同时在 feh 中。为此,我使用了以下参数:

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

Ranger 通过将文件路径添加到文本文件的末尾来非常简单地存储标记图像。当您取消图像标记时,它会删除该文件路径。

然而,当我将其集成到游骑兵的文件打开器/执行器步枪时,我遇到了一个问题。 Rifle 本质上是一个文件执行器,它会进行一些文件类型检查,以确定您要使用什么来打开文件。我将上面的单行代码添加到步枪中,如下所示:

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我知道我真的不应该在这里问问题......尽管有一点帮助,这很可能会成为某人的答案,因为它仍然与最初的问题密切相关。

相关内容