单行Perl命令重命名文件

时间:2011-08-25 20:50:43

标签: perl

到目前为止,这个单行正在剥离一行并重命名文件,但我需要帮助来改变它,以便它删除我要查找的那行Data for并删除旧的文件扩展名{{1而不是添加到它。 (.csv)。我不确定这是否可以通过单行完成。

相反,它会添加扩展名.csv.out

实施例

filename.csv.out

一衬垫:

 test_20110824.csv.out

我想替换扩展程序:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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