Вам необходимо использовать переименовать .
Вот его подпись:
rename <strong>OLDNAME,NEWNAME</strong>
Чтобы сделать его рекурсивным, используйте его вместе с File :: Find
use strict;
use warnings;
use File::Basename;
use File::Find;
#default searches just in current directory
my @directories = (".");
find(\&wanted, @directories);
sub wanted {
#renaming goes here
}
Следующий фрагмент кода будет выполнять код внутри требуемого для всех найденных файлов. Вы должны завершить часть кода внутри wanted , чтобы сделать то, что вы хотите.
РЕДАКТИРОВАТЬ: я пытался выполнить эту задачу, используя File :: Find, и я не думаю, что вы можете легко достичь этого. Вы можете добиться успеха, выполнив следующие действия:
если параметр является dir, используйте его заглавные буквы и получите все файлы
для каждого файла, если это каталог, вернитесь в начало с этим файлом в качестве аргумента
если файл является обычным файлом, используйте заглавные буквы
Perl только мешал мне при написании этого сценария. Я написал этот скрипт на ruby:
require "rubygems"
require "ruby-debug"
# camelcase files
class File
class << self
alias :old_rename :rename
end
def self.rename(arg1,arg2)
puts "called with #{arg1} and #{arg2}"
self.old_rename(arg1,arg2)
end
end
def capitalize_dir_and_get_files(dir)
if File.directory?(dir)
path_c = dir.split(/\//)
#base = path_c[0,path_c.size-1].join("/")
path_c[-1].capitalize!
new_dir_name = path_c.join("/")
File.rename(dir,new_dir_name)
files = Dir.entries(new_dir_name) - [".",".."]
files.map! {|file| File.join(new_dir_name,file)}
return files
end
return []
end
def camelize(dir)
files = capitalize_dir_and_get_files(dir)
files.each do |file|
if File.directory?(file)
camelize(file.clone)
else
dir_name = File.dirname(file)
file_name = File.basename(file)
extname = File.extname(file)
file_components = file_name.split(/\s+/)
file_components.map! {|file_component| file_component.capitalize}
new_file_name = File.join(dir_name,file_components.join(" "))
#if extname != ""
# new_file_name += extname
#end
File.rename(file,new_file_name)
end
end
end
camelize(ARGV[0])
Я попробовал скрипт на моем ПК, и он прописал все каталоги, подкаталоги и файлы по правилу, которое вы упомянули. Я думаю, что это поведение, которое вы хотите. Извините, что не предоставил версию Perl.