Экранирование скобок в именах файлов - PullRequest
1 голос
/ 07 мая 2011

У меня есть несколько файлов с такими именами: file (2).jpg.Я пишу небольшой Perl-скрипт для их переименования, но получаю ошибки из-за того, что скобки не заменяются. Так .Может кто-нибудь сказать мне, как экранировать все скобки (и пробелы, если они вызывают проблемы) в строке, чтобы я мог передать его команде.Сценарий ниже:

#Load all jpgs into an array.
@pix = `ls *.JPG`;

foreach $pix (@pix) {

    #Let you know it's working
    print "Processing photo ".$pix;

    $pix2 = $pix;
    $pix2 =~ \Q$pix\E;    # Problem line

    #Use the program exiv2 to rename the file with timestamp
    system("exiv2 -r %Y_%m%d_%H%M%S $pix2");
}

Ошибка заключается в следующем:

Can't call method "Q" without a package or object reference at script.sh line [problem line].

Я впервые с регулярным выражением, поэтому я ищу ответы, которые объясняют, что делать, кака также дает ответ.Спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 07 мая 2011

Почему не использовать простой?

find . -name \*.JPG -exec exiv2 -r "%Y_%m%d_%H%M%S" "{}" \;

Ps: Метасимволы \ Q отключают шаблон до \ E внутри регулярного выражения .

Например, если вы хотите найти путь "../../../somefile.jpg", вы можете написать:

$file =~ m:\Q../../../somefile.jpg\E:;

вместо

$file =~ m:\.\./\.\./\.\./somefile\.jpg:; #e.g. escaping all "dots" what are an metacharacter for regex.
1 голос
/ 07 мая 2011

Я нашел этот сценарий переименования perl, который был написан Ларри Уоллом некоторое время назад ... он делает то, что вам нужно, и многое другое. Я держу в своем $ PATH и использую его ежедневно ...

#!/usr/bin/perl -w

use Getopt::Std;

getopts('ht', \%cliopts);
do_help() if( $cliopts{'h'} );

#
# rename script examples from lwall:
#       pRename.pl 's/\.orig$//' *.orig
#       pRename.pl 'y/A-Z/a-z/ unless /^Make/' *
#       pRename.pl '$_ .= ".bad"' *.f
#       pRename.pl 'print "$_: "; s/foo/bar/ if <stdin> =~ /^y/i' *

$op = shift;
for (@ARGV) {
   $was = $_;
   eval $op;
   die $@ if $@;
   unless( $was eq $_ ) {
      if( $cliopts{'t'} ) {
         print "mv $was $_\n";
      } else {
         rename($was,$_) || warn "Cannot rename $was to $_: $!\n";
      }
   }
}

sub do_help {
   my $help = qq{
   Usage examples for the rename script example from Larry Wall:
        pRename.pl 's/\.orig\$//' *.orig
        pRename.pl 'y/A-Z/a-z/ unless /^Make/' *
        pRename.pl '\$_ .= ".bad"' *.f
        pRename.pl 'print "\$_: "; s/foo/bar/ if <stdin> =~ /^y/i' *

   CLI Options:
   -h      This help page
   -t      Test only, do not move the files
      };
   die "$help\n";
   return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...