2011-05-07 10 views
1

다음과 같은 파일이 있습니다. 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]. 

이 정규식 내 처음이다, 그래서 내가주는뿐만 아니라 무엇을 설명 해답을 찾고 있어요 대답. 어떤 도움을 주셔서 감사합니다.

+0

문자열 따옴표가 필요합니다. $ pix2 = "\ Q $ pix \ E"; – tadmc

+0

어리석은 나를. 내가 전에 Perl을 사용한 적이 없다고 말할 수 있습니다. – Bojangles

+0

파일 이름을 안전하게 이스케이프하기 위해'\ Q ... \ E'가 아닌'String :: ShellQuote'를 사용해야 함을주의하십시오. http://stackoverflow.com/q/3796682/23118. – hlovdal

답변

1

Larry Wall이 작성한이 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 [email protected] if [email protected]; 
    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; 
} 
+0

Mike, 도와 줘서 고마워.하지만 나 혼자서 얻었 어. quotemeta()는 이상하게 작동한다. 이 스크립트는 좋아 보이지만 내 요구에 맞지 않습니다. +1 노력 :-) – Bojangles

+0

당신은 자신의 답변을 게시하고 받아 들일 수 있다면 ... 또한 그에게 당신에게 measley 2 점을 얻을 것이다 :) –

+0

그는 그 비열한 생각, - P – Bojangles

2

왜 간단한 것을 사용하지 않습니까?

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

추신 : 정규식 내부 \ E 까지 패턴 메타 무력화 \ Q. 당신이 경로 "../../../somefile.jpg"와 일치 할 경우

예를 들어, 당신은 쓸 수 있습니다 :

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

대신 펄

$file =~ m:\.\./\.\./\.\./somefile\.jpg:; #e.g. escaping all "dots" what are an metacharacter for regex. 
관련 문제