Skip to content

Instantly share code, notes, and snippets.

@aldrinmartoq
Created August 29, 2018 16:26
Show Gist options
  • Save aldrinmartoq/4862b9fac99a65d27a84d9a6d28ac9da to your computer and use it in GitHub Desktop.
Save aldrinmartoq/4862b9fac99a65d27a84d9a6d28ac9da to your computer and use it in GitHub Desktop.
Ejecuta un comando que convierte archivos en paralelo, desde un directorio origen a otro de destino. Los archivos ya generados no los vuelve a generar.
#!/usr/bin/env ruby
# sudo gem install ruby-progressbar
require 'ruby-progressbar'
module ForkEach
def fork_each(progressbar, max = 4)
pids = []
self.each do |item|
progressbar.increment
pids << fork { yield item }
pids.delete(Process.wait 0) if pids.length >= max
end
pids.each { |pid| Process.wait pid }
end
end
Array.send(:include, ForkEach)
Range.send(:include, ForkEach)
# código que convierte archivos en paralelo
require 'find'
require 'fileutils'
prc = 4 # cuántos comandos a ejecutar en paralelo
cmd = "/Applications/calibre.app/Contents/MacOS/ebook-convert" # comando a ejecutar
src = '/Volumes/DISCO/Origen' # directorio de origen
dst = '/Volumes/DISCO/Destino' # directorio de destino
ini = /\.fb2$/ # exp. regular para calzar extensión archivos de origen
fin = '.epub' # extensión a poner en archivos de destino
items_ini = Find.find(src).select do |path|
true if path =~ ini && File.file?(path)
end
items_fin = items_ini.select do |path|
!File.exist?(path.sub(ini, fin))
end
items = items_fin.map do |path|
[path, dst + path[src.length..-1]]
end
puts "Se encontraron #{items_ini.count} archivos, se procesarán #{items_fin.count} con el comando #{cmd}.\nEjemplos:"
items.sample(5).each do |item|
puts " #{item.first}\n → #{item.last}\n"
end
print "ENTER para continuar, CTRL+C para cancelar "
gets
progressbar = ProgressBar.create title: 'Procesando', format: '%t %a %B %r %% | %E', total: items.count
items.fork_each(progressbar, 4) do |item|
FileUtils.mkdir_p File.dirname(item.last)
exec(cmd, item.first, item.last)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment