我正在尝试创建一个将所有文件名重命名为Camel/Capital Case的进程.我必须到达的最近的是:
perl -i.bak -ple 's/\b([a-z])/\u$1/g;' *.txt # or similar .extension.
Run Code Online (Sandbox Code Playgroud)
这似乎创建了一个备份文件(当我验证这是我想要的时候,我将删除它); 但它不是重命名文件,而是重命名文件内的文本.有更简单的方法吗?理论上我有几种不同格式的办公文件,因为我有点肛门保留,并希望它们看起来像这样:
New Document.odt Roffle.ogg Etc.Etc Bob Cat.flac Cat Dog.avi
这是可能用perl,还是我需要更改为另一种语言/它们的组合?
另外,无论如何都要使这个递归,这样/ foo/foo/documents都重命名了所有文件,/ foo/foo/documents/foo也是如此?
你需要使用重命名.
这是它的签名:
rename OLDNAME,NEWNAME
Run Code Online (Sandbox Code Playgroud)
要使其递归,请将其与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
}
Run Code Online (Sandbox Code Playgroud)
下面的代码片段,将执行代码里面想对所有被找到的文件.你必须完成想要做你想做的事情里面的一些代码.
编辑:我试图使用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])
Run Code Online (Sandbox Code Playgroud)
我在我的电脑上尝试了这个脚本,它按照你提到的规则将所有目录,子目录和文件大写.我认为这是你想要的行为.很抱歉没有提供perl版本.
小智 5
大多数系统都有重命名命令....
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/' *
Run Code Online (Sandbox Code Playgroud)
选项-v, - verbose详细:打印成功重命名的文件名.
-n, --no-act
No Action: show what files would have been renamed.
-f, --force
Force: overwrite existing files.
Run Code Online (Sandbox Code Playgroud)
作者拉里沃尔
诊断如果您提供无效的Perl表达式,您将收到语法错误.