0

重複ファイルを見つけるためのツールを見つけました。これで、重複ファイルを削除する準備が整いました。出力ファイルのフォーマットを少し見つめて、このスクリプトを思いついた。

#!/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/LilGalactus/music/Robert Johnson - Complete Recordings/Robert Johnson - The Complete Recordings (Disc2of2)[EAC-FLAC](oan)/s.gifつまり、データにエスケープされていないスペースや角かっこなどがたくさんあります。約30秒間、のようなvimコマンドを使用して文字をエスケープすることを検討しまし:s/\(/\\\(/gたが、その方法の制限はかなり明白だと思います。何か案は?

4

2 に答える 2

6
File.unlink(filename)

unlink数桁速くなり、引数をエスケープする必要はありません

何らかの理由でシェル呼び出しを使用したい場合は、次を使用してください。

system("rm", filename)

このようにして、エスケープする必要のあるすべてのものをエスケープします

于 2013-01-19T21:20:39.447 に答える
-3

それらをエスケープする代わりに、次のように二重引用符を追加するだけです。%x[ rm "#{filename}" ]

于 2013-01-19T21:22:12.910 に答える