Renamer 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/renamer +5 -88
- data/doc/ChangeLog.rdoc +5 -0
- data/lib/command_line.rb +99 -0
- data/lib/const.rb +3 -3
- data/lib/renamer.rb +230 -233
- data/po/fr/renamer.po +2 -4
- data/test/tc_renamer_procs.rb +347 -347
- data/test/ts_renamer.rb +5 -3
- metadata +2 -1
data/bin/renamer
CHANGED
@@ -38,9 +38,7 @@
|
|
38
38
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
39
39
|
=end
|
40
40
|
|
41
|
-
|
42
|
-
# Libraries #
|
43
|
-
#############
|
41
|
+
# Libraries
|
44
42
|
begin
|
45
43
|
require 'rubygems'
|
46
44
|
rescue LoadError
|
@@ -53,93 +51,12 @@ require 'tempfile'
|
|
53
51
|
|
54
52
|
require 'const'
|
55
53
|
require 'renamer'
|
54
|
+
require 'command_line'
|
56
55
|
|
57
|
-
|
58
|
-
# Initiliazing GetText #
|
59
|
-
########################
|
56
|
+
# Initiliazing GetText
|
60
57
|
include GetText
|
61
|
-
# Searching the path to locale directory
|
62
58
|
p = File.join(File.dirname(__FILE__), "/../locale/")
|
63
59
|
bindtextdomain("renamer", p)
|
64
60
|
|
65
|
-
|
66
|
-
|
67
|
-
########################
|
68
|
-
action, arg, $VERBOSE = nil
|
69
|
-
recursive, overwrite = false
|
70
|
-
|
71
|
-
opts = OptionParser.new
|
72
|
-
|
73
|
-
opts.banner = _("Usage: %s [options] FILENAMES") % File.basename($0)
|
74
|
-
opts.separator ""
|
75
|
-
opts.separator _("Specific options:")
|
76
|
-
|
77
|
-
opts.on("-d", "--downcase", _("Downcase FILENAMES")) { action = :downcase }
|
78
|
-
opts.on("-u", "--upcase", _("Upcase FILENAMES")) { action = :upcase }
|
79
|
-
opts.on("-c", "--capitalize", _("Capitalize FILENAMES")) { action = :capitalize }
|
80
|
-
opts.on("-w", "--word", _("Capitalize each words in FILENAMES")) { action = :word }
|
81
|
-
opts.on("--downcase_ext", _("Downcase FILENAMES extensions")) { action = :downcase_ext }
|
82
|
-
opts.on("--upcase_ext", _("Upcase FILENAMES extensions")) { action = :upcase_ext }
|
83
|
-
opts.on("-s", "--space", _("Replace spaces by underscores in FILENAMES")) { action = :space }
|
84
|
-
opts.on("-U", "--underscore", _("Replace underscores by spaces in FILENAMES")) { action = :underscore }
|
85
|
-
opts.on("--date", _("Add current date to the beginning of FILENAMES")) { action = :date }
|
86
|
-
opts.on("--datetime", _("Add current datetime to the beginning of FILENAMES")) { action = :datetime }
|
87
|
-
opts.on("-b", _("--basename BASENAME"), _("Rename FILENAMES using the specified"), _("BASENAME followed by an incremental number")) { |bn| action = :basename; arg = bn }
|
88
|
-
opts.on("-e", _("--ext NEW"), _("Rename FILENAMES from their actual extension"), _("to the NEW one")) { |new| action = :ext; arg = new }
|
89
|
-
opts.on("-f", "--trim-first n", _("Rename FILENAMES by trimming first n characters")) { |n| action = :trim_first; arg = n }
|
90
|
-
opts.on("-l", "--trim-last n", _("Rename FILENAMES by trimming last n characters"), _("to the NEW one")) { |n| action = :trim_last; arg = n }
|
91
|
-
opts.on("-r", "--recursive", _("Run %s recursively across directories") % Const::NAME) { recursive = true }
|
92
|
-
opts.on("-o", "--overwrite", _("Overwrite existing files if needed") % Const::NAME) { overwrite = true }
|
93
|
-
|
94
|
-
opts.separator ""
|
95
|
-
opts.separator _("Common options:")
|
96
|
-
|
97
|
-
opts.on_tail("-h", "--help", _("Show this help")) { puts opts.to_s; exit(0) }
|
98
|
-
opts.on("-v", "--version", _("Show %s version") % Const::NAME) { puts Const::NAME + " v" + Const::VER; exit(0) }
|
99
|
-
opts.on("-L", "--license", _("Show some information about %s license") % Const::NAME) { puts Const::LICENSE; exit(0) }
|
100
|
-
opts.on("-V", "--verbose", _("Run %s in verbose mode (quiet by default)") % Const::NAME) { $VERBOSE = true }
|
101
|
-
|
102
|
-
###################
|
103
|
-
# Parsing options #
|
104
|
-
###################
|
105
|
-
if ARGV.empty?
|
106
|
-
puts opts.to_s
|
107
|
-
exit(1)
|
108
|
-
end
|
109
|
-
filenames = opts.parse(ARGV)
|
110
|
-
|
111
|
-
####################
|
112
|
-
# Processing files #
|
113
|
-
####################
|
114
|
-
r = Renamer.new(filenames, recursive, overwrite)
|
115
|
-
|
116
|
-
case action
|
117
|
-
when :downcase
|
118
|
-
r.downcase
|
119
|
-
when :upcase
|
120
|
-
r.upcase
|
121
|
-
when :downcase_ext
|
122
|
-
r.downcase_ext
|
123
|
-
when :upcase_ext
|
124
|
-
r.upcase_ext
|
125
|
-
when :capitalize
|
126
|
-
r.capitalize
|
127
|
-
when :word
|
128
|
-
r.capitalize_words
|
129
|
-
when :space
|
130
|
-
r.space_to_underscore
|
131
|
-
when :underscore
|
132
|
-
r.underscore_to_space
|
133
|
-
when :basename
|
134
|
-
r.basename(arg)
|
135
|
-
when :ext
|
136
|
-
r.ext(arg)
|
137
|
-
when :trim_first
|
138
|
-
r.trim_first(arg)
|
139
|
-
when :trim_last
|
140
|
-
r.trim_last(arg)
|
141
|
-
when :date
|
142
|
-
r.current_date(Time.now)
|
143
|
-
when :datetime
|
144
|
-
r.current_datetime(Time.now)
|
145
|
-
end
|
61
|
+
# Command Line Handling and processing
|
62
|
+
Renamer::CommandLine.new
|
data/doc/ChangeLog.rdoc
CHANGED
data/lib/command_line.rb
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
class Renamer
|
2
|
+
# Process command-line arguments
|
3
|
+
class CommandLine
|
4
|
+
attr_accessor :action, :arg, :recursive, :overwrite, :opts, :filenames
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
$VERBOSE, self.recursive, self.overwrite = false
|
8
|
+
self.action, self.arg = nil
|
9
|
+
|
10
|
+
feed
|
11
|
+
parse
|
12
|
+
process
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
# Define available options
|
18
|
+
def feed
|
19
|
+
opts = OptionParser.new
|
20
|
+
|
21
|
+
opts.banner = _("Usage: %s [options] FILENAMES") % File.basename($0)
|
22
|
+
opts.separator ""
|
23
|
+
opts.separator _("Specific options:")
|
24
|
+
|
25
|
+
opts.on("-d", "--downcase", _("Downcase FILENAMES")) { self.action = :downcase }
|
26
|
+
opts.on("-u", "--upcase", _("Upcase FILENAMES")) { self.action = :upcase }
|
27
|
+
opts.on("-c", "--capitalize", _("Capitalize FILENAMES")) { self.action = :capitalize }
|
28
|
+
opts.on("-w", "--word", _("Capitalize each words in FILENAMES")) { self.action = :word }
|
29
|
+
opts.on("--downcase_ext", _("Downcase FILENAMES extensions")) { self.action = :downcase_ext }
|
30
|
+
opts.on("--upcase_ext", _("Upcase FILENAMES extensions")) { self.action = :upcase_ext }
|
31
|
+
opts.on("-s", "--space", _("Replace spaces by underscores in FILENAMES")) { self.action = :space }
|
32
|
+
opts.on("-U", "--underscore", _("Replace underscores by spaces in FILENAMES")) { self.action = :underscore }
|
33
|
+
opts.on("--date", _("Add current date to the beginning of FILENAMES")) { self.action = :date }
|
34
|
+
opts.on("--datetime", _("Add current datetime to the beginning of FILENAMES")) { self.action = :datetime }
|
35
|
+
opts.on("-b", _("--basename BASENAME"), _("Rename FILENAMES using the specified"), _("BASENAME followed by an incremental number")) { |bn| self.action = :basename; self.arg = bn }
|
36
|
+
opts.on("-e", _("--ext NEW"), _("Rename FILENAMES from their actual extension"), _("to the NEW one")) { |new| self.action = :ext; self.arg = new }
|
37
|
+
opts.on("-f", "--trim-first N", Integer, _("Rename FILENAMES by trimming first N characters")) { |n| self.action = :trim_first; self.arg = n }
|
38
|
+
opts.on("-l", "--trim-last N", Integer, _("Rename FILENAMES by trimming last N characters")) { |n| self.action = :trim_last; self.arg = n }
|
39
|
+
opts.on("-r", "--recursive", _("Run %s recursively across directories") % Const::NAME) { self.recursive = true }
|
40
|
+
opts.on("-o", "--overwrite", _("Overwrite existing files if needed") % Const::NAME) { self.overwrite = true }
|
41
|
+
|
42
|
+
opts.separator ""
|
43
|
+
opts.separator _("Common options:")
|
44
|
+
|
45
|
+
opts.on_tail("-h", "--help", _("Show this help")) { puts opts.to_s; exit(0) }
|
46
|
+
opts.on("-v", "--version", _("Show %s version") % Const::NAME) { puts Const::NAME + " v" + Const::VER; exit(0) }
|
47
|
+
opts.on("-L", "--license", _("Show some information about %s license") % Const::NAME) { puts Const::LICENSE; exit(0) }
|
48
|
+
opts.on("-V", "--verbose", _("Run %s in verbose mode (quiet by default)") % Const::NAME) { $VERBOSE = true }
|
49
|
+
|
50
|
+
self.opts = opts
|
51
|
+
end
|
52
|
+
|
53
|
+
# Parse arguments
|
54
|
+
def parse
|
55
|
+
if ARGV.empty?
|
56
|
+
puts self.opts.to_s
|
57
|
+
exit(1)
|
58
|
+
end
|
59
|
+
|
60
|
+
self.filenames = self.opts.parse(ARGV)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Send the requested job to Renamer
|
64
|
+
def process
|
65
|
+
r = Renamer.new(self.filenames, self.recursive, self.overwrite)
|
66
|
+
|
67
|
+
case self.action
|
68
|
+
when :downcase
|
69
|
+
r.downcase
|
70
|
+
when :upcase
|
71
|
+
r.upcase
|
72
|
+
when :downcase_ext
|
73
|
+
r.downcase_ext
|
74
|
+
when :upcase_ext
|
75
|
+
r.upcase_ext
|
76
|
+
when :capitalize
|
77
|
+
r.capitalize
|
78
|
+
when :word
|
79
|
+
r.capitalize_words
|
80
|
+
when :space
|
81
|
+
r.space_to_underscore
|
82
|
+
when :underscore
|
83
|
+
r.underscore_to_space
|
84
|
+
when :basename
|
85
|
+
r.basename(self.arg)
|
86
|
+
when :ext
|
87
|
+
r.ext(self.arg)
|
88
|
+
when :trim_first
|
89
|
+
r.trim_first(self.arg)
|
90
|
+
when :trim_last
|
91
|
+
r.trim_last(self.arg)
|
92
|
+
when :date
|
93
|
+
r.current_date(Time.now)
|
94
|
+
when :datetime
|
95
|
+
r.current_datetime(Time.now)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
data/lib/const.rb
CHANGED
data/lib/renamer.rb
CHANGED
@@ -17,285 +17,282 @@
|
|
17
17
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
18
18
|
=end
|
19
19
|
|
20
|
-
|
21
|
-
# Initiliazing GetText #
|
22
|
-
########################
|
20
|
+
# Initiliazing GetText
|
23
21
|
include GetText
|
24
|
-
# Searching the path to locale directory
|
25
22
|
p = File.join(File.dirname(__FILE__), "/../locale/")
|
26
23
|
bindtextdomain("renamer", p)
|
27
24
|
|
28
25
|
# Class Renamer handles files renaming
|
29
26
|
class Renamer
|
30
|
-
|
27
|
+
EXISTS = _("%s: %s file already exists!")
|
31
28
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
29
|
+
# Create a new Renamer object
|
30
|
+
def initialize(filenames, recursive = false, overwrite = false)
|
31
|
+
# Whether user wants to overwrite existing files or not
|
32
|
+
@overwrite = overwrite
|
36
33
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
else
|
44
|
-
@filenames << f
|
45
|
-
end
|
46
|
-
end
|
47
|
-
# In recursive mode we don't want to process directory names
|
48
|
-
@filenames.flatten!
|
49
|
-
@filenames.delete_if { |f| File.directory?(f) }
|
50
|
-
# User just wants to process given files
|
34
|
+
# User wants to process files recursively
|
35
|
+
if recursive
|
36
|
+
@filenames = Array.new
|
37
|
+
filenames.each do |f|
|
38
|
+
if File.directory?(f)
|
39
|
+
@filenames << Dir.glob("#{f}/**/*")
|
51
40
|
else
|
52
|
-
|
41
|
+
@filenames << f
|
53
42
|
end
|
43
|
+
end
|
44
|
+
# In recursive mode we don't want to process directory names
|
45
|
+
@filenames.flatten!
|
46
|
+
@filenames.delete_if { |f| File.directory?(f) }
|
47
|
+
# User just wants to process given files
|
48
|
+
else
|
49
|
+
@filenames = filenames
|
54
50
|
end
|
51
|
+
end
|
55
52
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
end
|
62
|
-
run(proc_dc)
|
63
|
-
end
|
64
|
-
|
65
|
-
# Upcase filenames
|
66
|
-
def upcase
|
67
|
-
proc_uc = Proc.new do |file|
|
68
|
-
new = file.upcase
|
69
|
-
rename_fs(file, new)
|
70
|
-
end
|
71
|
-
run(proc_uc)
|
53
|
+
# Downcase filenames
|
54
|
+
def downcase
|
55
|
+
proc_dc = Proc.new do |file|
|
56
|
+
new = file.downcase
|
57
|
+
rename_fs(file, new)
|
72
58
|
end
|
59
|
+
run(proc_dc)
|
60
|
+
end
|
73
61
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
# We want to grep the last extension
|
80
|
-
name = file.split('.')
|
81
|
-
if name.size > 1 # Ensure that there's an extension
|
82
|
-
# Now we downcase it
|
83
|
-
ext = name.last.downcase
|
84
|
-
# Building the new name
|
85
|
-
name = name[0...-1].join(".")
|
86
|
-
new = name + '.' + ext
|
87
|
-
# Renaming
|
88
|
-
rename_fs(file, new)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
run(proc_dc_ext)
|
62
|
+
# Upcase filenames
|
63
|
+
def upcase
|
64
|
+
proc_uc = Proc.new do |file|
|
65
|
+
new = file.upcase
|
66
|
+
rename_fs(file, new)
|
93
67
|
end
|
68
|
+
run(proc_uc)
|
69
|
+
end
|
94
70
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
end
|
111
|
-
end
|
71
|
+
# Downcase filename extensions
|
72
|
+
def downcase_ext
|
73
|
+
proc_dc_ext = Proc.new do |file|
|
74
|
+
# We don't want to process dotfiles
|
75
|
+
unless File.basename(file) =~ /^\./
|
76
|
+
# We want to grep the last extension
|
77
|
+
name = file.split('.')
|
78
|
+
if name.size > 1 # Ensure that there's an extension
|
79
|
+
# Now we downcase it
|
80
|
+
ext = name.last.downcase
|
81
|
+
# Building the new name
|
82
|
+
name = name[0...-1].join(".")
|
83
|
+
new = name + '.' + ext
|
84
|
+
# Renaming
|
85
|
+
rename_fs(file, new)
|
112
86
|
end
|
113
|
-
|
87
|
+
end
|
114
88
|
end
|
89
|
+
run(proc_dc_ext)
|
90
|
+
end
|
115
91
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
92
|
+
# Upcase filename extensions
|
93
|
+
def upcase_ext
|
94
|
+
proc_uc_ext = Proc.new do |file|
|
95
|
+
# We don't want to process dotfiles
|
96
|
+
unless File.basename(file) =~ /^\./
|
97
|
+
# We want to grep the last extension
|
98
|
+
name = file.split('.')
|
99
|
+
if name.size > 1 # Ensure that there's an extension
|
100
|
+
# Now we upcase it
|
101
|
+
ext = name.last.upcase
|
102
|
+
# Building the new name
|
103
|
+
name = name[0...-1].join(".")
|
104
|
+
new = name + '.' + ext
|
105
|
+
# Renaming
|
106
|
+
rename_fs(file, new)
|
121
107
|
end
|
122
|
-
|
108
|
+
end
|
123
109
|
end
|
110
|
+
run(proc_uc_ext)
|
111
|
+
end
|
124
112
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
end
|
131
|
-
run(proc_u2s)
|
113
|
+
# Replace spaces in filenames by underscores
|
114
|
+
def space_to_underscore
|
115
|
+
proc_s2u = Proc.new do |file|
|
116
|
+
new = file.gsub(/\s/, '_')
|
117
|
+
rename(file, new)
|
132
118
|
end
|
119
|
+
run(proc_s2u)
|
120
|
+
end
|
133
121
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
end
|
140
|
-
run(proc_capitalize)
|
122
|
+
# Convert underscores to spaces
|
123
|
+
def underscore_to_space
|
124
|
+
proc_u2s = Proc.new do |file|
|
125
|
+
new = file.gsub(/_/, ' ')
|
126
|
+
rename(file, new)
|
141
127
|
end
|
128
|
+
run(proc_u2s)
|
129
|
+
end
|
142
130
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
# Processing each words
|
149
|
-
new.gsub!(/(?:^|[\s_\b\.])\w/) { |el| el.upcase }
|
150
|
-
# extension has to be downcase
|
151
|
-
new.gsub!(/(\.\w+$)/) { |el| el.downcase }
|
152
|
-
# dotfiles have to be downcase
|
153
|
-
new.downcase! if new =~ /^\..+/
|
154
|
-
rename_fs(file, new)
|
155
|
-
end
|
156
|
-
run(proc_wcapitalize)
|
131
|
+
# Capitalize filenames
|
132
|
+
def capitalize
|
133
|
+
proc_capitalize = Proc.new do |file|
|
134
|
+
new = file.capitalize
|
135
|
+
rename_fs(file, new)
|
157
136
|
end
|
137
|
+
run(proc_capitalize)
|
138
|
+
end
|
158
139
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
while File.exist?("#{basename}#{i}")
|
172
|
-
i = i.to_i + 1
|
173
|
-
i = sprintf("%04d", i.to_i)
|
174
|
-
end
|
175
|
-
new = basename + i
|
176
|
-
end
|
177
|
-
rename(file, new)
|
178
|
-
end
|
179
|
-
run(proc_basename, bn)
|
140
|
+
# Capitalize each word
|
141
|
+
def capitalize_words
|
142
|
+
proc_wcapitalize = Proc.new do |file|
|
143
|
+
# We start with a clean downcase name
|
144
|
+
new = file.downcase
|
145
|
+
# Processing each words
|
146
|
+
new.gsub!(/(?:^|[\s_\b\.])\w/) { |el| el.upcase }
|
147
|
+
# extension has to be downcase
|
148
|
+
new.gsub!(/(\.\w+$)/) { |el| el.downcase }
|
149
|
+
# dotfiles have to be downcase
|
150
|
+
new.downcase! if new =~ /^\..+/
|
151
|
+
rename_fs(file, new)
|
180
152
|
end
|
153
|
+
run(proc_wcapitalize)
|
154
|
+
end
|
181
155
|
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
# Adding the new extension
|
192
|
-
new = (extension == "" ? name : name + "." + extension)
|
193
|
-
rename(file, new)
|
194
|
-
end
|
156
|
+
# Rename files using a basename and a four digits number
|
157
|
+
def basename(bn)
|
158
|
+
proc_basename = Proc.new do |file, basename|
|
159
|
+
i = "0000"
|
160
|
+
file =~ /.*?\.(.*)$/
|
161
|
+
if $1 then
|
162
|
+
while File.exist?("#{basename}#{i}.#{$1}")
|
163
|
+
i = i.to_i + 1
|
164
|
+
i = sprintf("%04d", i.to_i)
|
195
165
|
end
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
proc_trim_first = Proc.new do |file, n|
|
202
|
-
# Grabbing name and ext
|
203
|
-
elements = file.split(".")
|
204
|
-
if elements.size < 2
|
205
|
-
name = elements.first
|
206
|
-
ext = nil
|
207
|
-
else
|
208
|
-
name = elements[0...-1].join('.')
|
209
|
-
ext = elements[-1, 1].first
|
210
|
-
end
|
211
|
-
|
212
|
-
# trimming the n first characters
|
213
|
-
new = [name[n..-1], ext].compact.join('.')
|
214
|
-
rename(file, new)
|
166
|
+
new = basename + i + "." + $1
|
167
|
+
else
|
168
|
+
while File.exist?("#{basename}#{i}")
|
169
|
+
i = i.to_i + 1
|
170
|
+
i = sprintf("%04d", i.to_i)
|
215
171
|
end
|
216
|
-
|
172
|
+
new = basename + i
|
173
|
+
end
|
174
|
+
rename(file, new)
|
217
175
|
end
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
# trimming the n last characters
|
233
|
-
new = [name[0, name.length - n], ext].compact.join('.')
|
176
|
+
run(proc_basename, bn)
|
177
|
+
end
|
178
|
+
|
179
|
+
# Change file extensions
|
180
|
+
def ext(e)
|
181
|
+
proc_ext = Proc.new do |file, extension|
|
182
|
+
# We don't want to process dotfiles
|
183
|
+
unless File.basename(file) =~ /^\./
|
184
|
+
# We want to remove the last extension
|
185
|
+
name = file.split(".")
|
186
|
+
name = name[0...-1].join(".") if name.size > 1
|
187
|
+
name = name.to_s
|
188
|
+
# Adding the new extension
|
189
|
+
new = (extension == "" ? name : name + "." + extension)
|
234
190
|
rename(file, new)
|
235
191
|
end
|
236
|
-
run(proc_trim_last, n)
|
237
192
|
end
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
193
|
+
run(proc_ext, e)
|
194
|
+
end
|
195
|
+
|
196
|
+
# Trim first n characters
|
197
|
+
def trim_first(n)
|
198
|
+
proc_trim_first = Proc.new do |file, n|
|
199
|
+
# Grabbing name and ext
|
200
|
+
elements = file.split(".")
|
201
|
+
if elements.size < 2
|
202
|
+
name = elements.first
|
203
|
+
ext = nil
|
204
|
+
else
|
205
|
+
name = elements[0...-1].join('.')
|
206
|
+
ext = elements[-1, 1].first
|
244
207
|
end
|
245
|
-
|
208
|
+
|
209
|
+
# trimming the n first characters
|
210
|
+
new = [name[n..-1], ext].compact.join('.')
|
211
|
+
rename(file, new)
|
246
212
|
end
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
213
|
+
run(proc_trim_first, n)
|
214
|
+
end
|
215
|
+
|
216
|
+
# Trim last n characters
|
217
|
+
def trim_last(n)
|
218
|
+
proc_trim_last = Proc.new do |file, n|
|
219
|
+
# Grabbing name and ext
|
220
|
+
elements = file.split(".")
|
221
|
+
if elements.size < 2
|
222
|
+
name = elements.first
|
223
|
+
ext = nil
|
224
|
+
else
|
225
|
+
name = elements[0...-1].join('.')
|
226
|
+
ext = elements[-1, 1].first
|
253
227
|
end
|
254
|
-
|
228
|
+
|
229
|
+
# trimming the n last characters
|
230
|
+
new = [name[0, name.length - n], ext].compact.join('.')
|
231
|
+
rename(file, new)
|
255
232
|
end
|
233
|
+
run(proc_trim_last, n)
|
234
|
+
end
|
256
235
|
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
if File.writable?(file) then
|
263
|
-
a_proc.call(file, *others)
|
264
|
-
else
|
265
|
-
warn _("%s: You don't have write access on %s") % [Const::NAME, file]
|
266
|
-
end
|
267
|
-
else
|
268
|
-
warn _("%s: File %s doesn't exists!") % [Const::NAME, file]
|
269
|
-
end
|
270
|
-
end
|
236
|
+
# Add date (using time arg) to the beginning of the filename
|
237
|
+
def current_date(time)
|
238
|
+
proc_current_date = Proc.new do |file, date|
|
239
|
+
new = [date, file].join('_')
|
240
|
+
rename(file, new)
|
271
241
|
end
|
242
|
+
run(proc_current_date, time.strftime("%Y-%m-%d"))
|
243
|
+
end
|
272
244
|
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
new = File.join(File.dirname(old), File.basename(new))
|
279
|
-
# Renaming the file
|
280
|
-
File.rename(old, new)
|
281
|
-
else
|
282
|
-
warn EXISTS % [Const::NAME, new]
|
283
|
-
end
|
245
|
+
# Add datetime (using time arg) to the beginning of the filename
|
246
|
+
def current_datetime(datetime)
|
247
|
+
proc_current_datetime = Proc.new do |file, datetime|
|
248
|
+
new = [datetime, file].join('_')
|
249
|
+
rename(file, new)
|
284
250
|
end
|
251
|
+
run(proc_current_datetime, datetime.strftime("%Y-%m-%d_%H-%M"))
|
252
|
+
end
|
285
253
|
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
tf = Tempfile.new("renamer")
|
294
|
-
File.rename(old, tf.path)
|
295
|
-
File.rename(tf.path, new)
|
296
|
-
tf.close(true)
|
254
|
+
private
|
255
|
+
# Helper to test files and run the specific job
|
256
|
+
def run(a_proc, *others)
|
257
|
+
@filenames.each do |file|
|
258
|
+
if File.exist?(file) then
|
259
|
+
if File.writable?(file) then
|
260
|
+
a_proc.call(file, *others)
|
297
261
|
else
|
298
|
-
|
262
|
+
warn _("%s: You don't have write access on %s") % [Const::NAME, file]
|
299
263
|
end
|
264
|
+
else
|
265
|
+
warn _("%s: File %s doesn't exists!") % [Const::NAME, file]
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
# Helper to rename files
|
271
|
+
def rename(old, new)
|
272
|
+
unless File.exist?(new) and @overwrite == false
|
273
|
+
# Expanding paths to make them reliable
|
274
|
+
old = File.expand_path(old)
|
275
|
+
new = File.join(File.dirname(old), File.basename(new))
|
276
|
+
# Renaming the file
|
277
|
+
File.rename(old, new)
|
278
|
+
else
|
279
|
+
warn EXISTS % [Const::NAME, new]
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
# Helper to rename files ensuring compatibily on all FS
|
284
|
+
def rename_fs(old, new)
|
285
|
+
unless File.exist?(new) and @overwrite == false
|
286
|
+
# Expanding paths to make them reliable
|
287
|
+
old = File.expand_path(old)
|
288
|
+
new = File.join(File.dirname(old), File.basename(new))
|
289
|
+
# Renaming the file
|
290
|
+
tf = Tempfile.new("renamer")
|
291
|
+
File.rename(old, tf.path)
|
292
|
+
File.rename(tf.path, new)
|
293
|
+
tf.close(true)
|
294
|
+
else
|
295
|
+
warn EXISTS % [Const::NAME, new]
|
300
296
|
end
|
297
|
+
end
|
301
298
|
end
|