Как проверить, что файл существует и переименовать в perl - PullRequest
3 голосов
/ 31 марта 2010

Возможный дубликат: Переименование и перемещение файлов в Bash или Perl

Я новичок в Perl и ищу скрипт, который будет обрабатывать перемещение файлов.

#!/usr/bin/perl -w
$filename = 'DUMBFILE';
$destination = '/some/location/';
if (-e $destination + $filename) {
  print "File Exists ! Renaming ..";
  move ('/tmp/' + $filename, $destination + $filename + '.1');
} else {
  move ('/tmp/' + $filename, $destination + $filename);
}

Я могу переименовать его в 1, но я хочу переименовывать постепенно, например, если file.1 существует, переименовать в .2 и .3, если .2 существует.

РЕДАКТИРОВАТЬ: и сохранить расширение таким же; как file.exe становится file.exe.1, file.exe.2 и т. д.

Ответы [ 4 ]

4 голосов
/ 31 марта 2010

Вероятно, вы хотите что-то вроде:

use File::Copy;

sub construct_filename {
    my ($dir, $name, $counter) = @_;
    if ($name =~ /^(.*)\.(.*)$/) {
        return "$dir/$1.$counter.$2";
    } else {
        return "$dir/$name.$counter";
    }
}

if (-e "$destination$filename") {
    $counter = 1;
    while (-e construct_filename($destination,$filename,$counter)) {
        $counter++;
    }
    move("/tmp/$filename", construct_filename($destination,$filename,$counter));
} else {
    move("/tmp/$filename", "$destination$filename");
}

Кроме того, оператор объединения строк в perl имеет значение ., а не +. То, что вы написали, вообще не сработает. В этом случае вы можете просто использовать интерполяцию строк в двойных кавычках и не беспокоиться о конкатенации.

И для чего бы это ни стоило, более простое соглашение для каталогов - никогда не содержать завершающие косые черты и всегда использовать их при создании имен файлов (например, "$destination/$filename"). Как уже отмечали другие, самый надежный способ построения пути - это File::Spec. Из того, что я мог сказать, однако, часть, которую вы действительно искали, состояла в том, как сделать добавочное именование; поэтому я дал четкую и краткую версию этого. Обновите до File::Spec, как считаете нужным!

4 голосов
/ 31 марта 2010

Вам нужно объединить . вместо +:

if (-e $destination . $filename) {

Или даже лучше. Вы можете использовать File::Spec модуль:

use File::Spec;
...
if (-e File::Spec->join($destination, $filename)) {

И пожалуйста use strict;

Для перемещения файла вы можете использовать File::Copy модуль:

use File::Copy;
...
move($from, $to);
3 голосов
/ 31 марта 2010
#!/usr/bin/perl
use strict;
use warnings;

use File::Spec::Functions qw'catfile';
use File::Copy qw'move';
use autodie    qw'move';

my $filename    = 'DUMBFILE';
my $origin      = '/tmp';
my $destination = '/some/location';

my $path = catfile $destination, $filename;
{
  my $counter;
  while( -e $path ){
    $counter++;
    $path = catfile $destination, "$filename.$counter";
  }
}

move( catfile( $origin, $filename ), $path );
2 голосов
/ 31 марта 2010
#!/usr/bin/perl -w
$filename = 'DUMBFILE';
$destination = '/some/location/';
$filepath=$destination.$filename;
if (-e $filepath) {
  print "File Exists ! Renaming ..";
  $counter++;
  rename('/tmp/'.$filename.$filepath.$counter);
} else {
  move ('/tmp/'.$filename.$filepath);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...