我一直在努力使它工作一段时间。我看到使用perl -pie
递归在Perl中搜索和替换的帖子,但无法正常工作。
这就是我所拥有的:
perl -pie 's/a-z/A-Z/g' *.ods
这没有匹配。
答案 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,我会编写一个脚本而不是一个脚本:
#!/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)
假设您确实要修改文件的名称而不是内容,这是使用find
和xargs
命令以及称为{{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
的美化形式,并支持递归模式,因此您可以使用rename
和find
跳过:
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`
选项。