一个衬里可将以特定扩展名结尾的文件递归地将小写转换为大写

时间:2018-12-15 04:44:36

标签: perl

我一直在努力使它工作一段时间。我看到使用perl -pie递归在Perl中搜索和替换的帖子,但无法正常工作。

这就是我所拥有的:

perl -pie 's/a-z/A-Z/g' *.ods

这没有匹配。

4 个答案:

答案 0 :(得分:3)

  • -i带有一个可选的“参数”(用于备份的扩展名)。如果您不想备份,则需要在-i之后放置一个空格。
  • s/a-z/A-Z/g用字符串a-z替换字符串A-Z的所有实例。

修复:

perl -i -pe'tr/a-z/A-Z/' *.ods

答案 1 :(得分:2)

这可以做到。

perl -p -i -e 'tr/a-z/A-Z/' *.ods

答案 2 :(得分:2)

到目前为止给出的示例将在文件内容与文件名上进行操作。虽然您确实可以使用Perl来实现所需的功能,但建议您使用bash本身,前提是可以选择这样做。

如果您真的想使用Perl,我会编写一个脚本而不是一个脚本:

Perl示例

#!/usr/bin/env perl

use strict;
use warnings;

sub rename_file_extensions {
    my ( $dir, $orig_ext, $new_ext ) = @_;
    chdir($dir) or die "Can't chdir to $dir $!";
    opendir my $dh, $dir or die "Couldn't opendir: $!\n";
    for my $file ( readdir $dh ) {
        if ( -d $file && $file !~ /^\.+$/ ) {
            rename_file_extensions( "$dir/$file", $orig_ext, $new_ext );
        }
        else {
            if ( ( my $txt = $file ) =~ s/$orig_ext$/$new_ext/ ) {
                rename( $file, $txt ) or die "Can't rename: $!";
            }
        }
    }
    closedir $dh;
}

rename_file_extensions( $ARGV[0], $ARGV[1], $ARGV[2] );

上面的脚本将称为perl script.pl /path_to_files ods ODS。它将遍历/ path_to_files中的所有目录;将file.ods的每个实例重命名为file.ODS

仅重击示例

find . -name "*.ods" -exec bash -c 'mv "$1" "${1%.ods}".ODS' - '{}' \;

欢呼

答案 3 :(得分:2)

假设您确实要修改文件的名称而不是内容,这是使用findxargs命令以及称为{{1}的Perl脚本的另一种方法}(这是Perl随附的示例脚本,可通过rename软件包在Debian上使用)。

rename

使用此脚本的优点是,您可以在实际更改文件名之前先使用% find -type f -name '*.ods' | xargs rename -n 's!(.+/)(.+)!$1 . lc($2)!e' 选项进行模拟(干模式)。确认结果符合预期后,就可以再次运行而无需使用-n选项。

示例文件:

-n

示例输出:

% find
.
./Sub1
./Sub1/FOUR.ODS
./Sub1/three.ods
./Sub1/Two.ods
./sub2
./sub2/five.ODS
./sub2/Five.ods
./One.ods

另一种替代方法是使用CPAN提供的perlmv脚本(例如,使用rename(./Sub1/Two.ods, ./Sub1/two.ods) rename(./sub2/Five.ods, ./sub2/five.ods) rename(./One.ods, ./one.ods) 安装)。该脚本是cpanm -n App::perlmv的美化形式,并支持递归模式,因此您可以使用renamefind跳过:

xargs

% perlmv -d -R -e'$_ = lc if /\.ods$/' . 用于空运行模式,-d用于递归。样本输出:

-R

确定可以得到正确的结果后,请删除INFO: chdir `/zpool_host_mnt/mnt/home/s1/tmp/ods/.` ... DRYRUN: move `One.ods` -> `one.ods` INFO: chdir `/zpool_host_mnt/mnt/home/s1/tmp/ods/Sub1` ... DRYRUN: move `Two.ods` -> `two.ods` INFO: chdir `/zpool_host_mnt/mnt/home/s1/tmp/ods/sub2` ... DRYRUN: move `Five.ods` -> `five.ods` 选项。