Everyday Scripting with Python-Ruby-Groovy-Shell

Everyday Scripting with Python-Ruby-Groovy-Shell

Recently, I am learning Scripting language, I think it would be a good idea to exercise them in everyday life to solve practical problems.

Example One.
I have some music as 'track 1.mp3, ... track 100.mp3', I want to rename them to 'track 001.mp3, ... track 100.mp3', so my ipod can arrange them naturally.

Ruby Implementation:

ruby rename_files.rb --path '/home/human/music' --suffix mp3 --prefix 'track '--fill 0

# == Synopsis
#   This script is used to rename files with SUFFIX under PATH, it would left pad file names with FILL(default 0)
#
# == Examples
#     rename_files --path '/home/scott/music' --suffix mp3 --prefix 'track ' --fill '0'
#
# == Usage
#   rename_files --path PATH --suffix Suffix --prefix Prefix --fill Fill
#
#   For help use: rename_files -h
#
# == Options
#   -h, --help          Displays help message
#   -p, --path          Mandatory:  files under this PATH would be renamed
#   -s, --suffix        Mandatory:  files with this SUFFIX would be renamed
#   --prefix            Optional:   file names with this PREFIX would be renamed, default to be empty string
#   -f, --fill          Optional:   file names would be left padded with this FILL, default to be 0

require 'optparse'
require 'rdoc/usage'

def fill_file_names(path, suffix, prefix = "", fill = "0")
  match = prefix + "*." + suffix
  puts path, match, fill
  Dir.chdir(path)
 
  puts Dir[match]
  max_len_file_name = Dir[match].max  {|a,b|  a.size  <=>  b.size  }
  max_len = max_len_file_name.size
  Dir.glob(match)  do |file_name|
    if prefix.empty?
      new_file_name = fill * (max_len - file_name.size) + file_name
    else
      new_file_name = file_name.sub(prefix, prefix + fill * (max_len - file_name.size))
    end    
    puts  "file_name: " + file_name + "; new_file_name " + new_file_name
    next if file_name == new_file_name
    if File.exist?(new_file_name)
      puts "Cann't rename file #{file_name} to #{new_file_name}, #{new_file_name} already exsits, skipped."
    end
    File.rename(file_name, new_file_name) if !File.exist?(new_file_name)
  end
  puts
  puts Dir[match]
end

def pasre_options(args)
  options = {}
  options[:prefix] = ""
  options[:fill] = '0'
  OptionParser.new do |opts|
#    opts.banner = "Usage: rename_files.rb [options], this script is used to rename files with SUFFIX under PATH, it would left pad file names with FILL(default 0)."

    # Mandatory argument.
    opts.on("-p", "--path PATH", "Mandatory: files under this PATH would be renamed") do |path|
      options[:path] = path
    end
    opts.on("-s", "--suffix SUFFIX", "Mandatory: files with this SUFFIX would be renamed") do |suffix|
      options[:suffix] = suffix
    end
    # Optional argument.
    opts.on("--prefix PREFIX", "Optional: file names with this PREFIX would be renamed, default to be empty string") do |prefix|
      options[:prefix] = prefix
    end
    opts.on("-f", "--fill FILL", "Optional: file names would be left padded with this FILL, default to be 0") do |fill|
      options[:fill] = fill
    end
    # No argument, shows at tail.  This will print an options summary.
    # Try it and see!
    opts.on_tail("-h", "--help", "Show help message") do
      RDoc::usage()
    end
  end.parse!
  return [options, false] if options[:path].nil? || options[:suffix].nil?
  [options, true]
end

def exit_with_usage
  RDoc::usage() #exits app
end
options, success = pasre_options(ARGV)
exit_with_usage unless success
fill_file_names(options[:path], options[:suffix], options[:prefix], options[:fill])


Groovy Implementation:

groovy rename_filenames.groovy -p "/home/human/music" -s mp3 -x "track " -f 0

def fill_file_names(path, suffix = "", prefix = "", fill = "0") {
    dir = new File(path)
    match = prefix + ".*"
    if(suffix != "")
        match += "\\." + suffix
    max_len = 0
    dir.eachFileMatch(~/$match/){file -> if (file.name.size() > max_len) max_len = file.name.size() }
    dir.eachFileMatch(~/$match/){file ->
        if (prefix.empty)
            new_file_name = dir.path + File.separator + fill * (max_len - file.name.size()) + file.name
        else
            new_file_name =  dir.path + File.separator + file.name.replaceAll(prefix) { prefix + fill * (max_len - file.name.size()) }
        if (!file.absolutePath.equals(new_file_name)) {
            if(new File(new_file_name).exists())
                println "Cann't rename file ${file} to ${new_file_name}, ${new_file_name} already exsits, skipped."
            else {
                file.renameTo(new File(new_file_name))
                println "File ${file} is renamed to ${new_file_name}"
            }
        }
    }
}
def pasre_options(args) {
    def cli = new CliBuilder( parser: new org.apache.commons.cli.GnuParser (), usage: 'groovy rename_filenames --path PATH --suffix SUFFIX --prefix PREFIX --fill FILL' )
    cli.h(longOpt: 'help', 'usage information')
    //Mandatory argument.
    cli.p(longOpt:'path', args: 1, required: true,
            "Mandatory: files under PATH would be renamed")
    //Optional argument.
    cli.s(longOpt:'suffix', args: 1, "Optional: files with SUFFIX would be renamed")    
    cli.x(longOpt:'prefix',   args: 1, "Optional: file names with PREFIX would be renamed, default to be empty string")
    cli.f(longOpt:'fill',   args: 1, "Optional: file names would be left padded with this FILL(default 0)")
    def opt = cli.parse(args)
    if (opt.h) {
        cli.usage()
        return [null, false];
    }
    return [opt, true];
}
result = pasre_options(args)
options = result[0]
success = result[1]
if(success) {
    path = options.p
    suffix = (options.s? options.s : "")
    prefix = (options.x? options.x : "")
    fill = (options.f? options.f : "0")
    fill_file_names(path,suffix,prefix,fill)
}


Python3 Implementation:

python rename_filenames.py -p '/home/human/music' --prefix "track " -s mp3 --fill 0

#!/usr/bin/env python3
import os, sys
import glob
from optparse import OptionParser
def fill_file_names(path, suffix, prefix="", fill="0"):
    match = prefix + "*"
    if(suffix != ""):
        match += "." + suffix    
    os.chdir(path)
    max_len = 0
    for file in glob.glob(match):
        if len(file) > max_len:
            max_len = len(file)
    print("max_len =",max_len)
    for file in glob.glob(match):
        if (prefix == ""):
            new_file_name = fill * (max_len - len(file)) + file
        else:
            new_file_name = file.replace(prefix, prefix + fill * (max_len - len(file)))
        if (file == new_file_name): continue
        if os.path.exists(new_file_name):
            print("Cann't rename file", file , "to", new_file_name, "," , new_file_name, "already exsits, skipped.")
        else:
            os.rename(file, new_file_name)
            print("File", file, "is renamed to", new_file_name)
def pasre_options(args):
    #refer http://docs.python.org/library/optparse.html
    usage = "usage: %prog [options] arg"
    parser = OptionParser(usage)
    parser.add_option("-p", "--path", dest="path", help="Mandatory: files under PATH would be renamed")
    parser.add_option("-s", "--suffix", dest="suffix", help="Optional: files with SUFFIX would be renamed")
    parser.add_option("-x", "--prefix", dest="prefix", help="Optional: file names with PREFIX would be renamed, default to be empty string")
    parser.add_option("-f", "--fill", dest="fill", help="Optional: file names would be left padded with this FILL, [default: %default]")
    parser.set_defaults(prefix="", suffix="", fill="0")
    #parser.add_option("-v", "--verbose", action="store_true", dest="verbose")
    (options, args) = parser.parse_args()
    if options.path is None:
         parser.print_help()
         os._exit(-1)
    return options
if __name__ == "__main__":
    options = pasre_options(sys.argv)
    fill_file_names(options.path, options.suffix,options.prefix, options.fill)

Labels

Java (159) Lucene-Solr (110) Interview (61) All (58) J2SE (53) Algorithm (45) Soft Skills (37) Eclipse (33) Code Example (31) Linux (24) JavaScript (23) Spring (22) Windows (22) Web Development (20) Nutch2 (18) Tools (18) Bugs (17) Debug (16) Defects (14) Text Mining (14) J2EE (13) Network (13) Troubleshooting (13) PowerShell (11) Chrome (9) Design (9) How to (9) Learning code (9) Performance (9) Problem Solving (9) UIMA (9) html (9) Http Client (8) Maven (8) Security (8) bat (8) blogger (8) Big Data (7) Continuous Integration (7) Google (7) Guava (7) JSON (7) ANT (6) Coding Skills (6) Database (6) Scala (6) Shell (6) css (6) Algorithm Series (5) Cache (5) Dynamic Languages (5) IDE (5) Lesson Learned (5) Programmer Skills (5) System Design (5) Tips (5) adsense (5) xml (5) AIX (4) Code Quality (4) GAE (4) Git (4) Good Programming Practices (4) Jackson (4) Memory Usage (4) Miscs (4) OpenNLP (4) Project Managment (4) Spark (4) Testing (4) ads (4) regular-expression (4) Android (3) Apache Spark (3) Become a Better You (3) Concurrency (3) Eclipse RCP (3) English (3) Happy Hacking (3) IBM (3) J2SE Knowledge Series (3) JAX-RS (3) Jetty (3) Restful Web Service (3) Script (3) regex (3) seo (3) .Net (2) Android Studio (2) Apache (2) Apache Procrun (2) Architecture (2) Batch (2) Bit Operation (2) Build (2) Building Scalable Web Sites (2) C# (2) C/C++ (2) CSV (2) Career (2) Cassandra (2) Distributed (2) Fiddler (2) Firefox (2) Google Drive (2) Gson (2) How to Interview (2) Html Parser (2) Http (2) Image Tools (2) JQuery (2) Jersey (2) LDAP (2) Life (2) Logging (2) Python (2) Software Issues (2) Storage (2) Text Search (2) xml parser (2) AOP (1) Application Design (1) AspectJ (1) Chrome DevTools (1) Cloud (1) Codility (1) Data Mining (1) Data Structure (1) ExceptionUtils (1) Exif (1) Feature Request (1) FindBugs (1) Greasemonkey (1) HTML5 (1) Httpd (1) I18N (1) IBM Java Thread Dump Analyzer (1) JDK Source Code (1) JDK8 (1) JMX (1) Lazy Developer (1) Mac (1) Machine Learning (1) Mobile (1) My Plan for 2010 (1) Netbeans (1) Notes (1) Operating System (1) Perl (1) Problems (1) Product Architecture (1) Programming Life (1) Quality (1) Redhat (1) Redis (1) Review (1) RxJava (1) Solutions logs (1) Team Management (1) Thread Dump Analyzer (1) Visualization (1) boilerpipe (1) htm (1) ongoing (1) procrun (1) rss (1)

Popular Posts