2013-02-28 2 views
0

Я очень новичок в Ruby и разветвляется мимо первых сценариев, спрашивая, что такое мой любимый цвет, и повторяет его мне. Я делаю то, что я считал относительно простой задачей, перемещая файлы и меняя имена.Добавление имен файлов в Ruby?

У меня есть куча файлов в подкаталогах, которые мне нужно переместить в один каталог, а затем добавить имена файлов всех из них. В частности, нужно сохранить исходное имя и добавить его в конец, IE AAB701.jpg -> AAB701_01.jpg.

Мне удалось найти файлы и переместить их (возможно, неэффективно), но мне не повезло добавить имя файла. Поиск Google, stackoverflow и т. Д., Не повезло.

Это код, который у меня есть сейчас.

require 'find' 
require "fileutils" 

file_paths = [] 
Find.find('../../../Downloads') do |path| 
    file_paths << path if path =~ /.*\.jpg$/ 
end 

file_paths.each do |filename| 
    name = File.basename('filename') 
    dest_folder = "../../../Desktop/Testing/" 
    FileUtils.cp(filename, dest_folder) 
end 

file_paths.each do |fullname| 
append_txt = '_01' 
filename = "*.jpg" 
fullname = File.join(filename, append_txt) 

end 

Фактических дорожки довольно несущественный, но я не достаточно знаком с File.join или GSUB, чтобы выяснить, что случилось/лучше.

ответ

0

Сначала я бы извлечь какую-то работу в небольшой метод:

def new_name(fn, dest = '../../../Desktop/Testing/', append = '_01') 
    ext = File.extname(fn) 
    File.join(dest, File.basename(fn, ext) + append + ext) 
end 

Тогда я применить более функциональный стиль вашего каталога обхода и обработки:

Dir[ '../../../Downloads/**/*.jpg' ]. 
select { |fn| File.file? fn }. 
each { |fn| FileUtils.cp fn, new_name(fn) } 

Кроме того, я не 'Посмотрите, что модуль Find покупает вас за Dir#[] и в глянцевом мире, давайте фильтровать в jpg бесплатно.

+0

Ничего себе, это так намного чище. Я столкнулся с проблемой, тем не менее, в том, что он поддерживает расширение файла, а затем добавляет к нему. И.Е. - AAB701.jpg-01.jpg –

+0

@ LukePatton извините, я забыл, что ['Файл :: basename'] (http://ruby-doc.org/core-1.9.3/File.html#method-c-basename) немного смешно. Для этого требуется второй аргумент, описывающий расширение полосы. Я обновил ответ. – dbenhur

+0

Собственно исправил это сам. Использовал аргумент file.basename, чтобы исключить расширение. РЕДАКТИРОВАТЬ: Просто увидел ваше дополнение, извините. Я добавил «.jpg» вместо ext, но ext кажется, что лучше адаптировать скрипт. –

0

Я бы изменил ваш звонок на FileUtils.cp.

append_txt = '_01' 
file_paths.each do |filename| 
    name = File.basename('filename') 
    newname = name + append_txt # + File.extension() 
    dest_folder = "../../../Desktop/Testing/" 
    FileUtils.cp(filename, dest_folder + newname) 
end 

Обратите внимание, что этот код не защищен от вредоносных имен файлов; вы должны искать документы по обработке файлов для другого способа сделать это.

0

Более простой ответ для файла:

require 'pathname' 

new_name =Pathname(orig_fn).sub_ext("01#{Pathname(orig_fn).extname}").to_s 
Смежные вопросы