bash脚本中右键单击项目(例如jpg)的变量?
Posted
技术标签:
【中文标题】bash脚本中右键单击项目(例如jpg)的变量?【英文标题】:Variable for a right-clicked item (say, a jpg) in a bash script? 【发布时间】:2019-09-17 15:15:19 【问题描述】:我有一个非常简单的 bash 脚本,我经常从 cli 运行,但我发现必须打开终端、识别正确的文件并运行它并认为最简单的方法是运行它是令人沮丧的作为右键单击的选项。我正在运行 Ubuntu 18.04 LTS。
脚本只是擦除 exif 数据,留下方向标签,本质上是这样的:
exiftool -all= -tagsfromfile @ -Orientation file-*.jpg
有没有办法让脚本识别我正在右键单击哪个图像?我不知道要在 file-*.jpg 部分中放入什么,这将是“我现在右键单击的任何图像”的变量。
尝试搜索如何做到这一点很长一段时间,但显然要么没有使用正确的搜索词,要么不经常这样做。提前感谢您的帮助!
【问题讨论】:
可能包括您的操作系统和用户界面的一些细节。 感谢您的提醒,@Kingsley!我添加了我的操作系统。我不确定用户界面是什么。 X? 这不是你想要的,但你可以试试exiftool ... $(zenity --file-selection)
。它不会向常规文件浏览器添加右键单击选择,但它允许您使用文件浏览器组件来选择文件。
谢谢你,@jamieguinan,我已经可以做右键单击上下文菜单部分了,但我想你已经回答了我试图找出的问题......如何使变量相等“无论我右键单击什么文件”手指交叉。如果可行,您能否将其改写为答案,以便我可以正确单击它?发送!
【参考方案1】:
如果您希望脚本在文件管理器右键菜单中运行,您必须更改脚本并将文件定义为参数。只需将带有$1
的文件部分更改为$n
作为参数即可。
据我所知,ubuntu 使用 nautilus 作为文件管理器。
您可以从终端或破折号运行nautilus-actions-config-tool
,并为脚本定义名称和要运行的命令。您可以点击此链接进行插图学习:
ubuntu nautilus defile script in menu
例如:
#!/bin/bash 如果 [ "$1" != "" ];然后 echo "位置参数 1 包含值 $1" 别的 echo "位置参数1为空" 菲对于所有参数:
#!/bin/bash 如果 [[ "$#" -gt 0 ]];然后 对于 "$@" 中的 arg;做 回声 $arg 完毕 菲here is the image that shows the script worked
【讨论】:
嗨,马赫迪,你能再解释一下第一部分吗?我没有在上面的脚本中使用“$1”,所以我对你在说什么感到困惑。我已经知道 nautilus-actions-config-tool,这不是问题。只是我不清楚如何在 bash 脚本中表示该文件(称为 *.jpg)是被右键单击的文件。 (可能这就是@jamieguinan 提醒我的……我要去看看!)【参考方案2】:我知道这个问题有点老了,但我可以为您提供解决方案。
您必须设置FileManager-actions
,这是 GNOME/Nautilus 的扩展(但它也适用于其他文件管理器)。
在 Ubuntu 20.04 上设置文件管理器操作
sudo apt update
sudo apt install filemanager-actions
然后运行fma-config-tool
并创建一个新操作。
创建动作时,请确保:
[v] 在选择上下文菜单中显示项目被标记;否则,在文件选择期间您将看不到上下文菜单。
准备你要执行的脚本
准备一个满足您需要的脚本。在/usr/bin
中触摸/tmp
、mv
并授予其执行权限:
touch /tmp/your-script
# edit it with your editor
sudo mv /tmp/your-script /usr/bin/
sudo chmod +x /usr/bin/your-script
在您的脚本中,您可以使用$1
引用文件名。
FILENAME=$1
echo $FILENAME
在变量FILENAME
中,您将找到选定的文件名。
配置 Nautilus-action 命令
要让 nautilus 传递文件名,请在“命令”选项卡中插入脚本路径和参数字符串。
要完全回答您的问题,让 Nautilus 将文件名作为脚本参数传递,您必须指定 %f
。
此时,退出 Nautilus 实例并再次打开它:
nautilus -q
nautilus
现在,让我们试试吧!右键单击文件并查看结果!
附录 1 - Filemanager-actions 格式
%f
单个文件名,即使选择了多个文件。
%F
文件列表。每个文件都作为单独的参数传递给可执行程序。
%u
单个 URL。本地文件可以作为 file: URL 或文件路径传递。
%U
URL 列表。每个 URL 都作为单独的参数传递给可执行程序。
%d
基本目录
Here你可以找到一个完整的列表。
附录 2 - 来源
查看我的博文,其中我实际上意识到了类似的事情:https://gabrieleserra.ml/blog/2021-08-14-filemanager-actions-ubuntu-20-04.html 对 FileManager 操作的所有可能格式的引用:https://askubuntu.com/a/783313/940068 在 Ubuntu 18.04 中实现:https://askubuntu.com/a/77285/940068【讨论】:
这行得通!感谢您的清晰解释和逐步说明。我唯一缺少的链接是该选项直到我完全注销并重新登录后才出现。之后……完美!很高兴再次拥有此功能! 一个额外的跟进。在上面的描述中,似乎使用 %F(而不是 %f)将允许我同时选择多个文件并让脚本在这些文件上运行。但是,我只得到一个......无论我选择一个文件还是多个文件。有没有办法将其扩展到许多选定的文件,还是我一次只能这样做一个? 我必须尝试,但我认为使用%F
文件名是在参数中传递的。因此,当您选择多个文件并且想要访问例如第二个文件名时,您必须使用$2
、$3
作为第三个文件名,依此类推。然后,$#
包含给脚本的参数数量(或在这种特殊情况下为文件名)。
我的脚本只是一个使用 exiftool 剥离信息并将文件保存在文件夹中的单行 exif 删除程序。我在脚本中使用 $1,但也许解决方案是让脚本成为一个循环?如果它类似于“while %F, then (do something here, $1, $2, $3, etc.)?我的脚本可能是问题所在?它只设置为一个单独的文件运行一次?我想我'我不太了解 %f 和 %F 有何不同。两者都在我的脚本中工作,但一次只能处理一个图像。此时,我基本上已经设置好了。真的,这更像是一个调整,理解。谢谢非常适合您!
我可以使用:while $# do script here done 哪个变量将用于循环遍历选定的文件?以上是关于bash脚本中右键单击项目(例如jpg)的变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何保证我获得用户在 CTreeControl 中右键单击的项目的“HTREEITEM”
当我在 Visual Studio 2017 的解决方案资源管理器中右键单击 Web 项目时,无法将添加->现有项目视为 Azure Web 作业选项