Ruby脚本:出现%x(命令)和意外(错误)

Ruby脚本:出现%x(命令)和意外(错误),ruby,bash,scripting,Ruby,Bash,Scripting,我找到了一个查找重复文件的工具,现在我准备删除重复文件。我盯着输出文件的格式看了一会儿,然后想出了这个脚本 #!/usr/bin/env ruby contents = File.open('fdupes-result', 'rb') { |f| f.read } duplicates = contents.split("\n\n") duplicates.each do |set| list = set.split("\n").reverse list.drop(1).each

我找到了一个查找重复文件的工具,现在我准备删除重复文件。我盯着输出文件的格式看了一会儿,然后想出了这个脚本

#!/usr/bin/env ruby 

contents = File.open('fdupes-result', 'rb') { |f| f.read }
duplicates = contents.split("\n\n")

duplicates.each do |set|
  list = set.split("\n").reverse
  list.drop(1).each do |filename|
      # print "rm #{filename}"
      %x[ rm #{filename} ]
  end
end
注释的
print
语句是我用来无损测试的语句,它似乎工作得很好。但是当我添加
%x
命令时,我开始得到

sh: 1: Syntax error: "(" unexpected
我不知道发生了什么,直到我意识到这个文件的名字像
/media/lillactus/music/Robert Johnson-Complete Recordings/Robert Johnson-the Complete Recordings(Disc2of2)[EAC-FLAC](oan)/s、 gif
——也就是说,我的数据中充满了未转义的空格、括号等。在大约30秒钟的时间里,我考虑使用vim命令来转义字符,比如
:s/\(/\\\(/g
),我认为这种方法的局限性非常明显。有什么想法吗

File.unlink(filename)
取消链接
将快几个数量级,并且不需要参数转义

如果出于某种原因仍要使用shell调用-请使用:

system("rm", filename)
这样,它就可以逃避一切必须逃避的事情

取消链接
将快几个数量级,并且不需要参数转义

如果出于某种原因仍要使用shell调用-请使用:

system("rm", filename)

这样,它将转义所有必须转义的内容

而不是转义它们只需添加双引号如下:
%x[rm”{filename}]
而不是转义它们只需添加双引号如下:
%x[rm”{filename}]

啊哈!有这么多方法可以在*nix中精确处理数据--谢谢!当
filename
gotcha先生“我不需要逃避任何事情”时会发生什么
?是的,总有一天你会自食其果。啊哈!有这么多方法可以精确处理*nix中的数据——谢谢!当
filename
gotcha先生“我不需要逃避任何事情”时会发生什么
?是的,这样你总有一天会自食其果的。+1在我完成我的工作之前注意到
系统的多参数版本。+1在我完成我的工作之前注意到
系统的多参数版本。
我建议你忘记
%x[…]
(以及相应的反勾号)存在。正确和安全地使用它们非常困难和混乱,并且有更好的替代方案。我建议您忘记存在
%x[…]
(和反勾号等效物)。正确和安全地使用它们非常困难和混乱,并且有更好的替代方案。