some help here would be appreciated. The goal is to rename all .txt files to .text from a user entered directory in ruby. I have to use fileutils as a requirement. When I run my current script I do not receive any errors. However, nothing happens either... I'm sure one of you could probably help me pinpoint the issue.
#!/usr/bin/ruby
#This program was written by me
puts “what directory would you like to change? “
require 'fileutils'
pathname = gets.chomp
def rename(pathname)
currentdir = Dir.new('.')
newfile = FileTest.exists?(pathname.to_s)
if pathname != "q"
if newfile == "true"
require 'fileutils'
newfile.each do |f|
FileUtils.mv "#{File.dirname(f)}/#{File.basename(f, '.*')}.txt", "#{File.dirname(f)}/#{File.basename(f,'.*')}.text"
end
elsif currentdir
require 'fileutils'
(currentdir).each do |f|
FileUtils.mv "#{File.dirname(f)}/#{File.basename(f, '.*')}.txt", "#{File.dirname(f)}/#{File.basename(f,'.*')}.text"
end
else
puts "Invalid Path"
end
end
end
EDIT: I think I know the problem now, but don't know where to put the code. I need to cd to the directory that the user inputs, that should be the reason that I'm only able to change the .txt files in the home directory.
This question is different from one of the comments suggested because the requirement is to use fileutils and have the user enter the directory they would like to edit. This entry looks for a file name from ANYWHERE and does not use fileutils
As I understand from Your code,
1) You were not calling rename
function
2) Your rename
function had unnecessary checking of newfile
, currentdir
- if You want execute from current dir, it will understand "." symbol and will do glob in current dir.
I've moved pathname != "q"
to outside of rename
because of rename must do renaming, nothing else.
So final code:
#!/usr/bin/ruby
#This program was written by me
require 'fileutils'
def rename(pathname)
if File.directory?(pathname.to_s)
puts "renaming files in path"+pathname.to_s
Dir.glob(File.dirname(pathname.to_s)+"/*.txt").each do |f|
FileUtils.mv f, "#{File.dirname(f)}/#{File.basename(f,'.*')}.text"
puts "#{File.basename} => #{File.basename(f,'.*')}.text"
end
else
puts "Invalid Path"
end
end
puts "what directory would you like to change? "
pathname = gets.chomp
if pathname != "q"
rename(pathname)
end
p.s. normal user will just call:
rename -S .txt .text /path/to/files/*.txt
or:
rename -S .txt .text ./*.txt