LINUX.ORG.RU

perl, rename

 ,


0

2

у меня есть куча папок в котором куча файлов типа *_01.mp3 - *.99.mp3 и это все нужно переименовать в 01.mp3 - 99.mp3 написал в pеrl вот это (не кидайте тапками)

#!/usr/bin/perl
use strict;
opendir DIR, @ARGV[0] or die $!;
while(my $fname = readdir DIR)
{
    $fname =~ m/^.+(\d\d.mp3)$/i;
    if($1)
    {
        rename ($fname,"@ARGV[0]$1")
    }
}
closedir DIR;
проблема в rename я не понимаю как ему указать глобальный путь, чтобы он переименовал файлы. проблема именно в этом. помогите пожалуйста дописать скрипт.



Последнее исправление: SmilePlz (всего исправлений: 1)

File::Spec тебе в помощь

annulen ★★★★★
()

apt-get install rename

anonymous
()

Как-то так.

use strict;
use warnings;
use autodie qw(opendir closedir rename);
use File::Spec qw(catfile);

my $path = @ARGV[0];

opendir my $dir, $path;
while (my $name = readdir $dir) {
    if (my ($new_name) = $name =~ m{(\d\d\.mp3)$}i) {
        rename
            catfile($path, $name),
            catfile($path, $new_name);
    }
}
closedir $dir;
outtaspace ★★★
()
Последнее исправление: outtaspace (всего исправлений: 1)

Хе-хе. Тоже когда-то такой фигнёй занимался. Вот вам скрипт, разбирайте как хотите.)

#! /usr/bin/perl -w

  # grouprename.pl '*.mp3' '^(.+)- ' '@{[$i+13]} $1 - ' 'cp \"$f1\" \"$f2\"'
  # grouprename.pl '*.mp3' '^(.+)- ' '@{[$i+13]} $1 - ' "cp '\$f1' '\$f2'"

package FileUtils::GroupRename;

use utf8;

use strict;
use warnings;
use encoding 'utf8';
#use Encode;

use open qw(:std :utf8);
binmode STDOUT, ":utf8";
binmode STDIN,  ":utf8";
binmode STDERR, ":utf8";
#binmode(DATA,   ":utf8");

use feature 'unicode_strings';

use File::Basename;

__PACKAGE__->grouprename(@ARGV) unless caller();


sub grouprename {
  my ($self, $glob_file_pat, $replace_what, $replace_to,
      $shell_cmd, $perl_expr) = @_;

  my ($i, $me, $n) = (0, basename($0), '');

  #$myname =~ s/\.\///;
  #($me = $myname) =~ s/^.*\///;

  my $help = "Usage: $me {filename pattern} {what replace} {replace to} {cmd to exec} [perl code to exec before each operation]\n"
    . "Hint: you can use \$i, \$f1, \$f2 for number of file(iteration,starts with 0), original name of file and name of file after processing regexps and \$n is a free variable.\n"
      . "Files sorted by name in alphabetical order.\n"
        . "Example: #> $me '*.c' '\\w\.' 'e_\$n\.' 'cp \$f1 \$f2' '\$n=\$i+10;'\n";

  if ( !$glob_file_pat or !$replace_what or !$shell_cmd ){
    print "$help";
    return undef;
  }

  #$replace_what = '"'.$replace_what.'"';
  $replace_to = '"'.$replace_to.'"';
  $shell_cmd = '"'.$shell_cmd.'"';

  my @commands = ();

  foreach my $f1 (glob $glob_file_pat) {
    next if ( $f1 =~ m/$me$/ );
    eval($perl_expr) if $perl_expr;
    (my $f2 = $f1) =~ s/$replace_what/$replace_to/ee;
    push @commands, eval($shell_cmd);
    $i += 1;
  }

 ASK:
  print "Now we will exec:" . ($perl_expr ? "\nperl: $perl_expr" : '')
    . "\nshell(@{[$#commands+1]}): @{[$commands[0]]}\nIs it OK(yes/no/fullist)?\n";

  my $answer = <STDIN>;

  if ( $answer eq "yes\n" ) {
    map {system $_} @commands
  } elsif ( $answer eq "fullist\n") {
    print join "\n", @commands, "\n";
    goto ASK;
  } else {
    print "[Canceled]\n";
  }
  return 1;
}

Bad_ptr ★★★★★
()
Ответ на: комментарий от DELIRIUM

прочитал как

и минет на bash, perl, или haskell

anonymous
()
perl -e 'rename $_, s/.*(\d\d\.mp3)$/$1/r for @ARGV' *.mp3

или rename.pl

Deleted
()
% zmv -n '(**)/*([0-9][0-9].mp3)' '$1/$2'

мимо проходил

salsa
()
Ответ на: комментарий от outtaspace

Большое спасибо за помощь, всем кто участвовал

SmilePlz
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.