一个Perl单行命令重命名文件

5
到目前为止,这个一行代码已经剥离了一行并重命名文件,但我需要帮助修改它,使其剥离我要找的那一行Data for并删除旧的文件扩展名.csv,而不是添加到它上面(.csv.out)。我不确定是否可以用一行代码完成。
相反,它正在添加扩展名filename.csv.out

示例

 test_20110824.csv.out

一句话描述:

find -type f -name '*.csv' -exec perl -i.out -wlne '/^Data for/ or print' {} \;

我想替换文件扩展名:

test_20110824.out

看一下 Perl 的 rename 工具... $ rename 's/\.csv$/\.out/' *.csv - Fredrik Pihl
2
这是重命名的高级版本 - tchrist
2个回答

4
perl -MFile::Copy -we 'for (glob "*.csv") { my ($name) = /^(.+).csv/i; move($_, $name . ".out"); }'

要移除与 Data for 匹配的页眉:

perl  -MFile::Copy -MTie::File -wE 'for (glob '*x.csv') { tie my @file,
"Tie::File", $_ or die $!; shift @file if $file[0] =~ /^Data for/; 
untie @file; my ($name) = /^(.*).csv/i; move($_, $name . ".out"); }'

但这样就不再是一个单行代码了...
use strict;
use warnings;
use Tie::File;
use File::Copy;
use autodie;

for (@ARGV) {
    tie my @file, "Tie::File", $_;
    shift @file if $file[0] =~ /^Data for/;
    untie @file; 
    my ($name) = /^(.*).csv/i; 
    move($_, $name . ".out");
}

并且可以与以下内容一起使用:

$ script.pl *.csv

谢谢您的回复。我正在进行一个初始匹配,匹配的是一个名为“Data for”的标题,我想在重命名之前将其删除。我可以将它添加到这个字符串中吗? - jdamae
那是另一个问题了...好吧,让我们看看。 - TLP
抱歉,应该在我的原始一行代码中说明清楚,因为我正在执行那个步骤。 - jdamae
修改后的答案。不确定能否用一行代码顺畅地完成。 - TLP
你能详细说明一下 my ($name) = /^(.*).csv/i; 这行代码吗?我知道它在进行匹配,但是末尾的 i 是什么意思呢?再次感谢。 - jdamae
/i 是一个修饰符。您可以在此处阅读有关它的信息:http://perldoc.perl.org/perlre.html#Modifiers。 - TLP

1
一个简单的Bash shell脚本就足够了。
(shopt -s failglob; for i in *.csv.out; do echo mv $i ${i%csv.out}out; done)

需要使用shopt -s failglob确保如果没有匹配项,命令将失败而不是尝试将*.csv.out重命名为*.out。构造${i%csv.out}out删除尾随的csv.out并将其替换为只有out

在我这里编写的代码中,这只会回显它将执行的命令。当您满意它所做的操作时,请删除echo这个单词。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接