2010-12-30 1 views
2

제목이 모든 하위 폴더에서 설명하는대로 모든 이미지의 이름을 변경해야합니다. 정규식으로 괄호 안의 숫자를 추출한 다음 이름을 바꾸는 방법을 생각하고 있습니다. 주변을 검색 할 때 renamemmv 같은 도구가 있지만 jpg를 패드 이름을 바꿀 수는 없다는 것을 알았습니다.제로 패드 이름 바꾸기. 이미지 (2) .jpg -> Image (002) .jpg

문제를 해결하는 데 도움을 주시면 감사하겠습니다.

BTW : Windows 용이며 cygwin bash와 perl을 가지고 있습니다.

편집 :
모든 해답을 실험 한 결과.

  1. Cygwin에서 rename, 나는 정규식을 허용하지 않습니다 작동시킬 수있는 한,하지만 확실히 좋은 옵션, 예를 들면, 좋지 않다 Linux VM을 실행하고 Win SharedFolder를 마운트하여.
  2. sed을 사용하여 this shell script 인 Cygwin 용으로 더 나은 rename 도구를 만들 수 있습니다.
  3. pwd에 해당하는 Windows는 cd입니다.
  4. Hugmeir은 dev 릴리스 인 Perl 5.13+를 사용하여 유망한 솔루션을 게시했으나이를 읽을 때까지는 아마 안정적 일 것입니다.
  5. pad_left 하위는 printf 구문의 더 나은 대안이 아니지만 작동합니다.

답변

1

아래 코드는 Linux에서 테스트되었습니다. 귀하의 환경에서 작동하도록 수정해야 할 것이 무엇인지 모르겠습니다. 또한 .jpg 파일에 대한 하위 디렉토리 검색은 포함하지 않았습니다. 이런 방식으로 코드를 수정하고 싶다면 알려 주시기 바랍니다.

(편집 : 하위 디렉토리 전체 검색, 더 아래 프로그램의 버전을 확인하시기 바랍니다) :

file(1).jpg --> file(001).jpg 
file(2).jpg --> file(002).jpg 
file(20).jpg --> file(020).jpg 
file(200).jpg --> file(200).jpg 
다음

use strict; 
use warnings; 

sub pad_left { 
    my $num = shift; 

    if ($num < 10) { 
     $num = "00$num"; 
    } 
    elsif ($num < 100) { 
     $num = "0$num"; 
    } 

    return $num; 
} 

my @files = glob "*.jpg"; 

my @padded_names = map { 
          my $name = $_; 
          $name =~ s/^([\w ]+\()(\d+)\)/$1 . &pad_left($2) .')'/e; 
          $name; 
         } @files; 

foreach (0..$#files) { 
    rename($files[$_], $padded_names[$_]); 
    print "$files[$_] --> $padded_names[$_]\n"; 
} 

위의 프로그램은 파일의 이름을 변경하고 인쇄를

HTH

편집 : 개선 된 버전의 abov e 프로그램 - 이제는 .jpg 파일에 대한 하위 디렉토리 검색도 통합됩니다. 나는 :)이

use strict; 
use warnings; 
use File::Find; 

sub pad_left { 
    my $num = shift; 

    if ($num < 10) { 
     $num = "00$num"; 
    } 
    elsif ($num < 100) { 
     $num = "0$num"; 
    } 

    return $num; 
} 

sub new_name { 
    if (/\.jpg$/) { 
     my $name = $File::Find::name; 
     my $new_name; 
     ($new_name = $name) =~ s/^(.+\/[\w ]+\()(\d+)\)/$1 . &pad_left($2) .')'/e; 
     rename($name, $new_name); 
     print "$name --> $new_name\n"; 
    } 
} 

chomp(my $localdir = `pwd`);# invoke the script in the parent-directory of the 
          # image-containing sub-directories 

find(\&new_name, $localdir); 
+0

와우! 고마워요. 그것이 당신을 귀찮게하지 않는다면, 예, 부탁을 들어 도와주세요. –

+0

@ Eric Fortis 알았어. 갈거야 :) 잠깐만 기다려. – canavanin

+0

@Eric Fortis 조금 놀아 보니 기대했던 것보다 오래 걸렸습니다> _ canavanin

7

rename 명령이 할 수있는 ... 내 코드는 더 이상 하위 디렉토리 문제를 해결하는 답 헤이 주어진되었지만 지금 쯤으로 필요한 알지 :

rename 's/\d+/sprintf("%03d",$&)/e' *.jpg 
하위 디렉토리와

:

find . -type f -name \*.jpg -print0|xargs -0 rename 's/\d+/sprintf("%03d",$&)/e' 
+0

조언을 주셔서 고마워요. Mr. István –

+0

실제로 카라시 씨입니다.하지만 무엇이든간에) –

+0

더 이상 노력이 내 옆에 필요하지 않은 것 같습니다. – canavanin

1
perl -MFile::Find::Rule -E 'rename($_, s/ \(\K ([0-9]+) (?= \))/sprintf("%03s", $1) /rex) for File::Find::Rule->file->name("*.jpg")->in($ARGV[0])' directory_here 

이는 때문에/r에 플래그하지만 5.13+ Perls와 함께 작동합니다 .

편집 : Windows의 경우 외부 따옴표를 큰 따옴표로 변경하고 sprintf와 이름에서 이스케이프 처리하거나 다른 구분자 인 ala qq! % 03d!를 사용해야합니다.

EDIT2 : 와아, 내 구획 문자를 완전히 망쳤습니다.

+0

도 이것도 가지고 놀아 주셔서 감사합니다. –

+0

이전 버전과의 호환성 : perl -File :: Find :: Rule -E "(File :: Find :: Rule-> file-> name (q! *. txt! My Dropbox ')) {(my $ newname = $ _) = ~ s/\ (\ K ([0-9] +) (? = \))/sprintf (qq! % 03s !, $ 1)/ex; 이름 바꾸기 $ _, $ newname} " – Hugmeir

+1

다음은 새/r 플래그에 대한 brian d foy의 블로그 링크입니다. http://www.effectiveperlprogramming.com/blog/659 –

0

다시 한 번 접하는 경로에서, Windows를 사용하고 있고 프로그래밍을하기보다는 파일의 이름을 바꾸는 것이 목표 인 경우 프리웨어 Siren (http://www.scarabee-software.net/en/siren)을 시도하십시오. html) 정확히 필요한 것은 수행합니다. 다음 표현식 Image \(%N1{3}\).%le을 시도하십시오. 특히 이미지 용으로 특별히 수식화 된 %X* 표현을 확인하십시오.