这菲赫命令允许您递归地查看文件夹中的图像:
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
中正确引用的文件的路径,并且 依次将调用(在大多数实现中内置))和文件的完整路径作为参数。sh
sh
printf
sh
printf
%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我知道我真的不应该在这里问问题......尽管有一点帮助,这很可能会成为某人的答案,因为它仍然与最初的问题密切相关。