2011-06-11 64 views
0

這些文件夾中:如何使用Ruby獲取一個文件夾中的所有文件名?

This_is_a_very_good_movie-y08iPnx_ktA.mp4 
myMovie2-lKESbDzUwUg.mp4 
his_is_another_movie-lKESbDzUwUg.mp4 

如何通過給的最後一部分,y08iPnx_ktA從文件讀取字符串mymovie1的第一部分?例如:

get_first_part("y08iPnx_kTA") #=> "This_is_a_very_good_movie" 
+3

'mymovie1',那是哪裏來的?或者你想要「This_is_a_very_good_movie」? – Qtax 2011-06-11 16:47:16

+0

文件名可以包含多個連字符,還是在添加散列之前規範化名稱以刪除連字符? – 2011-06-11 18:09:05

回答

3

將問題分解成若干部分。 get_first_part應該是這樣的方法:

  1. 使用Dir獲取文件的列表。

  2. 迭代每個文件和;

    1. 提取 「名」( 'This_is_a_very_good_movie')和 「標籤」( 'y08iPnx_ktA')。每個文件應該使用相同的正則表達式。

    2. 如果「標籤」符合要查找的內容,則返回「名稱」。

編碼愉快。


玩在REPL和樂趣:-)

+0

感謝您的快速回答。 – mko 2011-06-13 15:16:50

1

能不能做到比這更清潔?經修訂的基礎上@Tin人的建議

def get_first_part(path, suffix) 
    Dir.glob(path + "*" + suffix + "*").map { |x| File.basename(x).gsub(Regexp.new("#{suffix}\.*$"),'') } 
end 

puts get_first_part("/path/to/files/", "-y08iPnx_kTA") 
+0

+1對於使用一張同時刷卡的巧妙技巧。我會爭辯說,'do/end'和更多的換行符會使它更清潔,但是...... ;-)爲什麼'map'呢? – 2011-06-11 17:26:51

+0

Dir.glob返回每個文件的完全限定路徑。可能有多個文件與模式匹配。 @yozloy只需要沒有後綴的基本名稱。有一個更好的方法嗎? – 2011-06-11 17:38:29

+0

OP不想給一個後綴,他想給一個子串。將'+'*''添加到您的glob中,您將滿足他的要求。 – 2011-06-11 18:06:35

1
def get_first_part(path, suffix) 
    Dir.entries(path).find do |fname| 
    File.basename(fname, File.extname(fname)).end_with?(suffix) 
    end.split(suffix).first 
end 

從@Steve威廉的回答膨脹的種類 - 除了不使用水珠(有沒有必要爲它當我們只與文件名工作) ,避免使用正則表達式,並使用File.exname(fname)來呼叫File.basename,因此您不必包含文件擴展名。還返回字符串「This_is_a_very_good_movie」而不是文件數組。

這當然會提高,如果沒有文件能找到。在這種情況下,如果你只是想返回nil如果比賽無法找到:

def get_first_part(path, suffix) 
    file = Dir.entries(path).find do |fname| 
    File.basename(fname, File.extname(fname)).end_with?(suffix) 
    end 
    file.split(suffix).first if file 
end 
1

如果文件名只一個連字符:

path = '/Users/greg/Desktop/test' 
target = 'rb' 

def get_files(path, target) 
    Dir.chdir(path) do 
    return Dir["*#{ target }*"].map{ |f| f.split('-').first } 
    end 
end 

puts get_files(path, 'y08iPnx_ktA') 
# >> This_is_a_very_good_movie 

如果有多個連字符:

def get_files(path, target) 
    Dir.chdir(path) do 
    return Dir["*#{ target }*"].map{ |f| f.split(target).first.chop } 
    end 
end 

puts get_files(path, 'y08iPnx_ktA') 
# >> This_is_a_very_good_movie 

如果代碼假定從包含文件的目錄中運行,那麼Dir.chdir可以刪除,簡化事情之一:

puts Dir["*#{ target }*"].map{ |f| f.split('-').first } 
# >> This_is_a_very_good_movie 

puts Dir["*#{ target }*"].map{ |f| f.split(target).first.chop } 
# >> This_is_a_very_good_movie 
+0

添男人感謝您讓我知道Dir []的用法, – mko 2011-06-14 08:54:07

相關問題