【问题标题】:One-liner Perl command to rename files用于重命名文件的单行 Perl 命令
【发布时间】:2015-09-18 22:10:45
【问题描述】:

到目前为止,这个单行正在剥离一行并重命名文件,但我需要帮助来改变它,以便它剥离我正在寻找的那一行 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


【解决方案1】:
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 进行初始匹配,我想在重命名之前将其删除。我可以把它加到这个字符串中吗?
  • 这完全是另一个问题.. 好吧,让我们看看。
  • 对不起,应该说清楚。当我在我原来的单线中执行该步骤时。
  • 已编辑答案。不确定这可以用单线顺利完成。
  • 你能详细说明my ($name) = /^(.*).csv/i;这行吗?我知道它在做一场比赛。最后的i 在做什么?再次感谢。
【解决方案2】:

一个简单的 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 一词。

【讨论】:

    猜你喜欢
    • 2016-02-26
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2016-05-29
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    相关资源
    最近更新 更多