2011-05-07 64 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 2011-05-07 13:47:25

+0

傻我。你可以告訴我以前從未使用過Perl。 – Bojangles 2011-05-07 13:49:09

+0

請注意,您應該使用'String :: ShellQuote'而不是'\ Q ... \ E'來安全地轉義文件名,請參閱http://stackoverflow.com/q/3796682/23118。 – hlovdal 2014-12-18 14:23:23

回答

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

感謝您的幫助邁克,但我自己得到了 - 'quotemeta()'創造奇蹟。這個腳本看起來不錯,但不符合我的需求。 +1的努力雖然:-) – Bojangles 2011-05-07 12:27:57

+0

你可以發佈自己的答案,並接受它,如果你喜歡...這也會讓你一個measley 2分:) – 2011-05-07 12:33:59

+0

他他是一個鬼鬼祟祟的想法;-P – Bojangles 2011-05-07 13:48:25

2

爲什麼不使用一個簡單的?

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

PS: 的\ Q禁用模式元字符,直到正則表達式內。\ E

例如,如果你想匹配的道路 「../../../somefile.jpg」,你可以這樣寫:

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

,而不是在Perl

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