Mirando los ejemplos de kch, dB. y Vishnu anterior, he reunido una sola línea que creo que es una solución más elegante:
Dir['**/'].reverse_each { |d| Dir.rmdir d if Dir.entries(d).size == 2 }
utilizo '**/'
en lugar de '/**/*'
para el pegote, que sólo devuelve los directorios, por lo que no tienen para probar si es un directorio más adelante. Estoy usando reverse_each
en lugar de sort.reverse.each
ya que es más corto y supuestamente más eficiente, de acuerdo con este post. Prefiero Dir.entries(d).size == 2
a (Dir.entries(d) - %w[ . .. ]).empty?
porque es un poco más fácil de leer y entender, aunque (Dir.entries(d) - %w[ . .. ]).empty?
probablemente funcionaría mejor si tuviera que ejecutar el script en Windows.
He probado esto bastante en Mac OS X y funciona bien, incluso con directorios vacíos recursivos.
pensó primero: sistema "find. -type d | xargs rmdir -p 2>/dev/null" – kch
Solo una nota, no quiero hacer esta operación de una vez desde la línea de comandos. Va a estar en un guión ruby. Lo que tienes arriba es una versión de línea cmd no? –
bueno, es un comando de shell, sí, pero invocado desde dentro de ruby usando 'Kernel.system';) – kch