Рушатся деревья папку с Рубином


Это быстрый скрипт на скорую руку, чтобы свернуть некоторые папки деревьями вплоть до отдельных папок. Конкретную ситуацию, которая возникла моя бывшая-коллекции в iTunes (это в настоящее время организовано музыка\исполнитель\альбом\Песни.(в mp3|конвертировать M4A) и я бы предпочел, чтобы музыка\Исполнитель\песня.форматах (MP3|M4A формат)).

#!/usr/bin/ruby

require 'optparse'
require 'pp'
require 'fileutils'

### parsing command line options via optparse, nothing to see here
options={}
optparse = OptionParser.new do|opts|
  opts.on('-h', '--help', 
          'Display this screen') do
    puts opts
    exit
  end
  opts.on('-t', '--type a,b,c', 
          Array, 'Specify filetypes to flatten out (defaults to mp3,m4a)') do|t|
    options[:types] = t
  end
end
optparse.parse!

### the setup (ideally, this would be in a `let` statement)
origin = Dir.pwd
if not options[:types]
  options[:types] = ["mp3", "m4a"]
end

### the actual work
ARGV.each do |target|
  FileUtils.cd("#{origin}/#{target}")
  options[:types].each{|ext| `find -iname '*.#{ext}' -exec mv {} ./ \\\;`}
  `find -depth -type d -empty -exec rmdir {} \\\;`
end
FileUtils.cd(origin)

Я делаю что-то глаз-stabbingly не так? Есть ли лучший способ справиться с любой из вышеперечисленных?

В частности, я подозреваю, что я мог бы заменить найти звонки с родного методов Ruby, но я не понимаю, как без существенного усложнения. Я также подозреваю, что есть лучший способ написания пакета fileutils.компакт-диск("#{происхождение}/#{цель}"), но при беглом прочтении реж не выявил ничего. Какие-либо советы?


#!/usr/bin/ruby

require 'optparse'
require 'pp'
require 'fileutils'

### parsing command line options via optparse
options={:types => ["mp3", "m4a"]}
optparse = OptionParser.new do|opts|
  opts.on('-h', '--help', 'Display this screen') do
    puts opts
    exit
  end
  opts.on('-t', '--type a,b,c', Array, 'Specify filetypes to flatten out (comma separated, defaults to mp3,m4a)') do|t|
    options[:types] = t
  end
end
optparse.parse!

### the actual work
ARGV.each do |target|
  FileUtils.cd(target) do
    options[:types].each{|ext| `find -iname '*.#{ext}' -exec mv {} ./ \\\;`} ##move all matched files into [target]
    `find -depth -type d -empty -exec rmdir {} \\\;` ##recursively delete all empty folders in [target]
  end
end
  • вариантов сейчас инициализируется заранее, а не проверяется .разбираем!
  • используя блок опции пакета fileutils.компакт-диск
  • удалены бесполезные окончательной диск обратно
  • попробовал Глоб вариант, но это просто ошибки без продолжения, если оно попадает в соответствующий файл в цель (т. е.. одно, что должен оставаться там, где она есть). Это, кажется, произошло, когда я прохожу :сила => правда тоже. В найти заметки о вызовах таких файлов, но все равно плющит, что он может. В Глоб маршрута также не чувствительны к регистру.


390
4
задан 15 мая 2011 в 04:05 Источник Поделиться
Комментарии
1 ответ

options={}
# ...
if not options[:types]
options[:types] = ["mp3", "m4a"]
end

Я бы инициализировать параметры по умолчанию во-первых, вместо того, чтобы проверить, является ли параметр установлен впоследствии. Т. е.

options = {:types => ["mp3", "m4a"]}


options[:types].each{|ext| `find -iname '*.#{ext}' -exec mv {} ./ \\\;`}

Это можно сделать с Глоб. Для этого я бы сначала изменить параметры [типы] , чтобы быть строкой (т. е. заменить массив с строк в optparse код и использовать "MP3 и M4A" вместо ["МР3", "форматы M4A"] как по умолчанию. Затем вы можете использовать реж.Глоб с пакета fileutils.МВ вроде этого:

Dir.glob("**/*.{#{ ext }}") {|f| FileUtils.mv(f, ".")}



Я подозреваю, что я мог бы заменить найти звонки с родного методов Ruby, но я не понимаю, как без существенного усложнения.

Для первого см. выше. Однако второй можно было бы действительно быть более сложным, чтобы заменить, так что я бы просто палка с найти звонок.



Я также подозреваю, что есть лучший способ написания пакета fileutils.компакт-диск("#{происхождение}/#{цель}")

Да, есть: компакт-диск дополнительно принимает блок. Когда данный блок, компакт-диск будет CD в данный каталог, выполните блок, а затем диск. Так что вы можете избавиться от происхождения и вобще

FileUtils.cd(target) do
...
end


FileUtils.cd(origin)

Даже без использования блока версия компакт-диска выше линии была бы совершенно ненужной. Изменение директории в конце скрипта не имеет никакого эффекта. Любой CD, выполняемых в процессе не повлияет на родительский процесс.

4
ответ дан 15 мая 2011 в 08:05 Источник Поделиться