2016-03-03 5 views
1

Я написал следующий код, чтобы переименовать несколько файлов в каталоге (от 'rb' до 'origin'):Проверьте некоторые файлы в массиве существует в каталоге

original_files = ['test1.rb', 'test2.rb'] 

ruby_block "Rename file" do 
    block do 
    for filename in original_files 
     newname = filename.split(".")[0] + '.origin' 
     ::File.rename("C:\\Test\\#{filename}", "C:\\Test\\#{newname}") 
    end 
    end 
end 

Когда я запускаю его во второй раз, я получаю что эти файлы не существуют, что ожидается.

Как я могу проверить, если эти файлы существуют или не нравится:

if ::File.exist?("C:\\Test\\*.origin") 
    Chef::Log.info("########## Your files are already renamed ############") 
else 
    my_code 
end 

или другим способом (возможно, чтобы проверить его в цикле)?

+0

Использование 'Dir' класса. – sawa

+0

Hi sawa, спасибо за ваш ответ. Не могли бы вы написать его в мой код (я пробовал это решение и не работал). Спасибо – goldver

+0

Чтобы получить имя файла без расширения, используйте 'File.basename ('test1.rb', '.rb')' – Stefan

ответ

1

Это мое решение после многочисленных попыток:

origin_files = ['test1.rb', 'test2.rb'] 
dir_path = "C:\\Test" 

ruby_block "Rename file" do 
    block do 
     for filename in origin_files 
      newname = filename.split(".")[0] + '.origin' 
      if ::File.exist?("#{dir_path}\\#{newname}") 
       Chef::Log.info("### Your file: #{newname} already renamed ###") 
      else 
       ::File.rename("#{dir_path}\\#{filename}", "#{dir_path}\\#{newname}") 
      end 
     end  
    end    
end 
0

вы можете проверить эти файлы, как этот код

files = ["test1.rb", "test2.rb"] 

path = "C:/test" 

files.each { |file_name| 
    base_name = File.basename(file_name, ".rb") 
    new_name = base_name + ".origin" 
    if File.exists?(File.join(path, new_name)) 
    Chef::Log.info("########## Your file #{base_name} are already renamed ############") 
    elsif File.exists?(File.join(path, file_name)) 
    File.rename(File.join(path, file_name), File.join(path, new_name)) 
    Chef::Log.info("########## Your file #{base_name} was renamed ############") 
    else 
    Chef::Log.info("########## Your file #{file_name} not exist ############") 
    end 
} 
0

Вы можете использовать Chef охранник для этой цели. Он автоматически регистрирует событие во время шеф-клиента перспективе как

ruby_block ххх (пропущено из-за not_if)

Вот пример:

origin_files = ['test1.rb', 'test2.rb'] 
dir_path = "C:\\Test" 

origin_files.each do | old_file | 
    base_name = File.basename(old_file, ".rb") 
    newfile = base_name + ".origin" 
    ruby_block "rename #{old_file}" do 
     block do 
     File.rename(File.join(dir_path, old_file), File.join(dir_path, newfile)) 
     end 
     not_if { File.exist?("#{dir_path}\\#{newfile}") } 
    end 
end