如何在Ruby脚本中将文件名引入shell脚本

问题描述 投票:0回答:1

Ruby 脚本,我想在其中运行 shell 脚本并传入带空格的文件名。我尝试过十几种方法。这是一个:

filename = "/Users/gscar/Pictures/_Photo Processing Folders/Watched folder for import to Photos/2024.03.25-16.09.59.gs.O.orf"
filename = filename.gsub(' ', '\ ')
'exiftool -Camera:DriveMode #{filename}'

其他包括对路径进行硬编码

result = %x{exiftool -Camera:DriveMode /Users/gscar/Pictures/_Photo\ Processing\ Folders/Watched\ folder\ for\ import\ to\ Photos/2024.03.25-16.09.59.gs.O.orf}
,这会导致“无法读取8个文件”

system 'exiftool -Camera:DriveMode "/Users/gscar/Pictures/_Photo Processing Folders/Watched folder for import to Photos/2024.03.25-16.09.59.gs.O.orf"'
无输出。

命令行

➜ exiftool -Camera:DriveMode "/Users/gscar/Pictures/_Photo Processing Folders/Watched folder for import to Photos/2024.03.25-16.09.59.gs.O.orf" Drive Mode                      : Single Shot; Electronic shutter

带有转义空格的命令行有效

➜ exiftool -Camera:DriveMode /Users/gscar/Pictures/_Photo\ Processing\ Folders/Watched\ folder\ for\ import\ to\ Photos/2024.03.25-16.09.59.gs.O.orf Drive Mode                      : Single Shot; Electronic shutter

我最终需要的是让这样的事情发挥作用。上面试图找出如何让文件名起作用:

filename = "/Users/gscar/Pictures/_Photo Processing Folders/Watched folder for import to Photos/2024.03.25-16.09.59.gs.O.orf"
gsubfilename = filename.gsub(' ', '\ ')
`"exiftool -Camera:DriveMode #{gsubfilename}"`

结果是:

sh: exiftool -Camera:DriveMode /Users/gscar/Pictures/_Photo\ Processing\ Folders/Watched\ folder\ for\ import\ to\ Photos/2024.03.25-16.09.59.gs.O.orf: No such file or directory
,但是当然在 shell 中运行它可以正常工作。

这里“逃避”我的是什么?谢谢

PS mini_exiftool 似乎无法处理“DriveMode”。

ruby shell escaping exiftool mini
1个回答
0
投票

正如评论所建议的,最好的方法是避免使用 shell,并使用数组中的参数调用命令。具体来说,对于

system
,如果除了程序名称之外至少向函数提供一个参数,则不会调用 shell。

system('exiftool', '-Camera:DriveMode', filename)

如果你真的想将参数解析委托给 shell,请使用

Shellwords
:

require 'Shellwords'

system("exiftool -Camera:DriveMode #{filename.shellescape}")
© www.soinside.com 2019 - 2024. All rights reserved.