当前位置:  开发笔记 > 编程语言 > 正文

如何在Perl中更改文件名的大小写?

如何解决《如何在Perl中更改文件名的大小写?》经验,为你挑选了2个好方法。

我正在尝试创建一个将所有文件名重命名为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也是如此?



1> Geo..:

你需要使用重命名.

这是它的签名:

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版本.



2> 小智..:

大多数系统都有重命名命令....

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表达式,您将收到语法错误.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有