Фиксация архиве неприятности с Рубином


Я в последнее время стал достаточно раздраженный чем-то об опыте командной строки в Linux, чтобы принять меры.

Я приветствую все комментарии, но и конкретные вещи, которые я бы хотел ввод, являются:

  • Есть ли что-то уже имеющееся, что это?
  • Как вы могли бы сделать то же самое на Perl или Python?
  • Как бы вы идти о сокращении здесь дублирования кода? (Файл-типы хэш выглядит достаточно схожими в обоих местах, что он чувствует, как я должен быть в состоянии реферат)
  • В распаковываем, есть лучший способ определения типа файла?
  • Вы можете думать о любых ситуациях, что бы вызвать пакет , чтобы взорвать (и какие пути решения этих ситуаций)? Просто не в состоянии сделать что-нибудь не слишком плохо, но (например) сжатие случайных других файлов является то, что я хотел бы избежать.

Взять 4:

распаковка:

#!/usr/bin/ruby

archive_types = { 
  "tar"     => ["tar", "-xvf"],
  "tar.gz"  => ["tar", "-zxvf"],
  "tgz"     => ["tar", "-zxvf"],
  "tar.bz2" => ["tar", "-jxvf"],
  "rar"     => ["unrar", "x"],
  "zip"     => ["unzip"]
}

ARGV.each do |target|
  file_type = target.match(/\.([^\W0-9]{3}?(\.\w+)?)$/)[1]
  if archive_types[file_type]
    args = archive_types[file_type].push target
    system(*args)
  else
    puts "Dunno how to deal with '#{file_type}' files"
  end
end

пакет (с добавлением --исключить варианты для моего удобства использования):

#!/usr/bin/ruby

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

archive_types = { 
  "tar"     => ["tar", "-cvf"],
  "tar.gz"  => ["tar", "-zcvf"],
  "tgz"     => ["tar", "-zcvf"],
  "tar.bz2" => ["tar", "-jcvf"],
  "zip"     => ["zip"]
}

########## parsing inputs
options = { :type => "tar", :excluded => [".git", ".gitignore", "*~"] }
optparse = OptionParser.new do|opts|
  opts.on("-e", "--exclude a,b,c", Array,
          "Specify things to ignore. Defaults to [#{options[:excluded].join ", "}]") do |e|
    options[:excluded] = e
  end
  opts.on("-t", "--type FILE-TYPE", 
          "Specify archive type to make. Defaults to '#{options[:type]}'. Supported types: #{archive_types.keys.join ", "}") do |t|
    options[:type] = t
  end
end
optparse.parse!
##########

ARGV.each do |target|
  if not archive_types[options[:type]]
    puts "Supported types are #{archive_types.keys.join ", "}"
    exit
  elsif options[:type] == "zip"
    exclude = options[:excluded].map{|d| ["-x", d]}.flatten
  else
    exclude = options[:excluded].map{|d| ["--exclude", d]}.flatten
  end
  args = archive_types[options[:type]] +
         [target + "." + options[:type], target] + 
         exclude
  system(*args)
end


347
2
задан 1 сентября 2011 в 08:09 Источник Поделиться
Комментарии
3 ответа

Как ваш пакет и распакуйте скрипты не удастся, если какой-либо из целей, содержат пробелы (или другие оболочки мета-символов) в их названии. Как правило, это почти всегда плохая идея, чтобы вставить аргументы в команды с помощью интерполяции строк.

Я предполагаю, что вы, используя обратные кавычки, а не система , потому что вы не хотите на выходе вызываются команды, чтобы перейти к экрану. В этом случае вы можете использовать ИО.к popen, который начиная с Ruby 1.9 может принимать массив в качестве своего первого аргумента.

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

6
ответ дан 4 сентября 2011 в 09:09 Источник Поделиться

"Возьми 2" выглядит значительно лучше, чем первоначальный вариант.
Одна ошибка, кажется, "дополнения" => "дополнения", которые должны быть "Рар" => "дополнения".

3
ответ дан 3 сентября 2011 в 06:09 Источник Поделиться

Я считаю, принимать по две (для распаковки) быть труднее читать, на самом деле. Это меньше, расширяемый, конечно, но для shell-скрипт, это хорошо, чтобы быть очень ясно, что вы делаете.

0
ответ дан 4 сентября 2011 в 04:09 Источник Поделиться