Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env ruby
- #http://pastebin.com/KSS0zU2F
- unless ARGV.count == 1
- abort 'Merges sequentially-named files.'
- end
- outfile = ARGV.first.sub(/.?\d+\z/, '')
- if File.size? outfile
- abort 'The outfile already exists.'
- end
- pattern = ARGV.first.sub(/\d+\z/, '')
- pattern.gsub!(/[\[\]\*\{\}]/, "\\\\\\0")
- if digits = ARGV.first[ /\d+\z/ ]
- pattern << '[0-9]' * digits.length
- else
- pattern << '.[0-9]*'
- end
- files = Dir.glob(pattern).sort
- if files.count < 2
- abort 'There needs to be at least 2 files.'
- end
- if files.first[ /\d+\z/ ].to_i != 1
- abort 'The first file in the series is missing.'
- end
- file_count = files.last[ /\d+\z/ ].to_i
- unless files.count == file_count
- abort '%s of %s files are missing.' % [
- file_count-files.count, file_count
- ]
- end
- unless size = File.size?(files.first)
- abort '"%s" is empty.' % files.first
- end
- if File.size?(files.first) == File.size?(files.last)
- abort 'One or more files seem to be missing.'
- end
- files[0..-2].each do |path|
- size == File.size?(path) and next
- abort '"%s" has an incorrect size.' % file
- end
- File.open outfile, 'w' do |outstream|
- files.each do |path|
- puts 'Merging "%s"' % path
- File.open(path) do |instream|
- IO.copy_stream(instream, outstream)
- end
- end
- outstream.fsync
- end
- files.each(&File.method(:unlink))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement