Created
August 29, 2018 16:26
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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