我正在尝试创建一个将所有文件名重命名为Camel/Capital Case的进程.我必须到达的最近的是:
perl -i.bak -ple 's/\b([a-z])/\u$1/g;' *.txt # or similar .extension.
这似乎创建了一个备份文件(当我验证这是我想要的时候,我将删除它); 但它不是重命名文件,而是重命名文件内的文本.有更简单的方法吗?理论上我有几种不同格式的办公文件,因为我有点肛门保留,并希望它们看起来像这样:
New Document.odt Roffle.ogg Etc.Etc Bob Cat.flac Cat Dog.avi
这是可能用perl,还是我需要更改为另一种语言/它们的组合?
另外,无论如何都要使这个递归,这样/ foo/foo/documents都重命名了所有文件,/ foo/foo/documents/foo也是如此?
你需要使用重命名.
这是它的签名:
rename OLDNAME,NEWNAME
要使其递归,请将其与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 }
下面的代码片段,将执行代码里面想对所有被找到的文件.你必须完成想要做你想做的事情里面的一些代码.
编辑:我试图使用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版本.
大多数系统都有重命名命令....
NAME重命名 - 重命名多个文件
大纲重命名[-v] [-n] [-f] perlexpr [files]
说明"rename"根据指定为第一个参数的规则重命名提供的文件名.perlexpr参数是一个Perl表达式,它应该至少修改一些指定文件名的Perl中的$ _字符串.如果表达式未修改给定的文件名,则不会重命名.如果命令行中没有给出文件名,则将通过标准输入读取文件名.
For example, to rename all files matching "*.bak" to strip the extension, you might say rename 's/\.bak$//' *.bak To translate uppercase names to lower, you’d use rename 'y/A-Z/a-z/' *
选项-v, - verbose详细:打印成功重命名的文件名.
-n, --no-act No Action: show what files would have been renamed. -f, --force Force: overwrite existing files.
作者拉里沃尔
诊断如果您提供无效的Perl表达式,您将收到语法错误.