Однострочная команда Perl для переименования файлов - PullRequest
5 голосов
/ 26 августа 2011

До сих пор эта однострочная строка удаляет одну строку и переименовывает файл, но мне нужна помощь, чтобы изменить его так, чтобы он убрал ту строку, которую я ищу Data for, и удалил старое расширение файла .csv вместо добавляя к этому. (.csv.out). Я не уверен, что это можно сделать с помощью одной строки.

Вместо этого добавляется расширение filename.csv.out

Пример

 test_20110824.csv.out

One-вкладыш:

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

Я хочу заменить расширение:

test_20110824.out

Ответы [ 2 ]

4 голосов
/ 26 августа 2011
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 голос
/ 26 августа 2011

Достаточно простого сценария оболочки Bash

(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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...