2013-01-19 19 views
0

我發現了一個工具來查找重複的文件,現在我準備好刪除重複文件了。我盯着輸出文件的格式,想出了這個腳本。Ruby腳本編寫:%x(命令)和意外(錯誤

#!/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)轉義字符,我認爲這種方法的侷限性非常明顯。有任何想法嗎?

+1

我建議你忘記'%x [']'(和反引號等價)存在。他們是非常困難和混亂正確和安全地使用,並有更好的選擇。 –

回答

-3

%x[ rm "#{filename}" ]

+0

啊哈!精確處理* nix中數據的方法有多種 - 謝謝! – tom

+2

當'filename'是'gotcha mr時會發生什麼?「我不需要轉義任何東西」'? –

+1

是的,這樣你有一天會用另一隻腳射自己。 –

6
File.unlink(filename) 

unlink會有一些幅度更快,不需要論證逃避

,如果你因爲某些原因仍想使用shell調用 - 使用:

system("rm", filename) 

這樣它會逃跑一切必須改爲逃避他們只需加雙引號這樣的轉義

+0

+1在我完成我的註冊之前注意到'system'的多參數版本。 –