2009-12-23 2 views
3

Я бегу сценарий Perl и попытаться выполнить переименование файлов, как показано ниже ..Как переименовать файлы в цикле в Perl

У меня есть список * .ru.jp файлов в папке с другими не связанных файлов. Я хотел бы переименовать номер, который у меня есть как счетчик.

В Bash, я хотел бы сделать, как ...

for i in $(ls *.ru.jp); do x=${i%%.*}; mv $i "$x"t"$counter".ru.jp ;done 

Например myfile.ru.jp будет переименован в myfilet1.ru.jp если счетчик равен 1. «т» просто именование в укажите t1, t2 ... и т. д. И есть внешний цикл, который в конечном итоге будет обозначать mafilet2.ru.jp и т. Д. По мере увеличения переменной счетчика.

Я хотел бы знать, как я мог писать и представлять аналогичные для цикла, как в Perl-скрипте?

Спасибо.

-joey

ответ

7

Вы можете использовать универсальный символ Perl и встроенный rename функции следующим образом:

use warnings; 
use strict; 

my $i = 1; 
for (<*.ru.jp>) { 
    my $file = $_; 
    s/\.ru\.jp$//; 
    my $new = $_ . 't'. $i . '.ru.jp'; 
    rename $file, $new or die "Can not rename $file as $new: $!"; 
    $i++; 
} 
8
perl -e 'for $old (@ARGV) { 
      ++$counter; 
      if (($new=$old) =~ s/(\.ru\.jp)\z/t$counter$1/) { 
      rename $old => $new or warn "$0: rename: $!\n"; 
      } 
     }' *.ru.jp 
+6

Я вроде как использую жирную запятую (=>) здесь, чтобы показать старый файл, становящийся новым :) – toolic

+4

И думать, что люди говорят, что код Perl не читается! –

+0

Конечно, что происходит, когда вы пишете 'push $ element => @ list'. Ой, неправильно. Будьте осторожны с жирной запятой. – jrockway

1

Я попробовал это, и это, кажется, делает работу:

#! /usr/bin/perl 

my $count = 0; 
for (<*.ru.jp>) 
{ 
     $count++; 
     /(.+)\.ru\.jp/; 
     rename $_, $1 . "t" . $count . ".ru.jp"; 
} 
+3

Никогда не используйте переменные захвата ('$ 1',' $ 2' и т. Д.) Безоговорочно! Вместо точки с запятой используйте '&&' после матча. Да, я понимаю, что это похоже на придирчивость в этом конкретном контексте, но разработка этой привычки спасет вас от преследования жестких ошибок. –

+0

Спасибо за совет :) Итак, вы бы хотели увидеть что-то вроде этого ?: /(.+)\.ru\.jp/ && переименовать $ _, $ 1. "t". $ count. ".ru.jp"; – Grimmy

+0

Да, или, может быть, подчеркнуть переименование, поставив его перед собой: 'rename ... if/(. +) \. Ru \ .jp /'. Оба игнорируют значение, возвращаемое из 'rename', поэтому любые сбои будут опасно тихими. Вы можете написать '/.../ && (переименовать ... || warn ...);', но это кажется немного странным. Еще одна важная привычка к разработке заключается в том, чтобы всегда проверять возвращаемые значения системных вызовов, например, «переименовывать», «открывать», «отключать» и т. Д. Даже «печать» и «закрытие» могут быть неудачными, поэтому проверяйте их при записи важных битов , –

1
$count = 1; 
for (<*.ru.jp>) 
{ 
     ($filename)=(/^(.*?)\.ru.jp$/); 
     rename $_,$filename."t".$count++.".ru.jp"; 
} 
1
use strict; 
my $c=0; 
rename("$1.ru.jp", "$1" . $c++ . ".ru.jp") while <*.ru.jp> =~ /(.+).ru.jp/; 
+0

Хорошо использовать строгий; также будут использовать предупреждения. –

1
my $counter=0; 
while(my $file=<*.ru.jp>){ 
    $counter++; 
    my ($front,$back) = split /\./,$file,2; 
    $newname="$front$counter".".t."."$back\n"; 
    rename $file $newname; 
} 
+0

Предложение: my $ counter ++ –

Смежные вопросы