2012-05-20 2 views
1
#!/usr/bin/perl -w 

use strict; 
use File::Copy; 
use File::Spec; 

my($chptr, $base_path, $new, $dir); 

$dir = "Full Metal Alchemist"; #Some dir 

opendir(FMA, $dir) or die "Can't open FMA dir"; 
while($chptr = readdir FMA){ 
$base_path = File::Spec->rel2abs($dir).'/'; #find absolute path of $fir 
if($chptr =~ m(Chapter\w*\d*)){ #some regex to avoid the .. and . dirs 
    $new = join(" 0", split(/\W/, $chptr)); #modify said sub directory 
    rename "$base_path$chptr", "$base_path$new" ? print "Renames $base_path$chptr to 
    $base_path$new\n" : die "rename failed $!"; 
    } 
} 
closedir FMA; 

Первоначально мой скрипт использовал только относительный путь для предварительной обработки перемещения, но по какой-то причине это оставляет подкаталоги незатронутыми. Мой следующий шаг состоял в том, чтобы перейти к абсолютной траектории, но безрезультатно. Я просто изучаю Perl, поэтому чувствую, что делаю простую ошибку. Где я ошибся? ТИАПереименование подкаталогов в Perl

+0

В чем проблема, которую вы хотите избежать? – aleroot

+0

В настоящее время я получаю ложный результат из инструкции переименования. Я хочу переименовать подкаталоги. Единственное, чего я избегаю, - это переименование ядра. и .. ссылки –

ответ

1

Вы можете исключить . и .. следующим образом:

if ($child ne '.' and $child ne '..') { ... } 

Некоторые общие замечания:

  • Всегда иметь очень четкую спецификацию того, что вы хотите сделать. Это также помогает всем, кто пытается вам помочь.
  • Непонятно, что здесь не так. Может быть, ваше регулярное выражение просто не соответствует каталогам, которые вы хотите, чтобы они соответствовали? В чем проблема?
  • Попробуйте сделать очень конкретные части (например, название каталога, в котором вы хотите начать обработку) в параметры. Очевидно, что некоторые особенности сложнее вносить в параметры, например, как и как переименовывать.
  • Использование opendir, readdir, rename и File::Spec подходит для запуска. Однако есть более простой способ: взглянуть на Path::Class module и, в частности, на его два подкласса. Они обеспечивают хорошо продуманный уровень абстракции над File::Spec (и более), и это в основном универсальный сервис для операций с файловой системой.
+0

Спасибо, мое регулярное выражение отлично работает, его просто переименовать op, который не работает. Я рассмотрю использование Path :: Class. Я просто смущен, почему переименование на самом деле не переименовывает каталоги. –

+0

'Файл :: Spec-> no_upwards()' лучше, вы знаете;) – gaussblurinc

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