2009-12-02 3 views
5

내가 이름을 변경하기 위해 노력하고있어 많은 파일이, 내가 그들을 일치하는 정규 표현식을 만들려고해야하지만이 파일에 붙어있어 심지어는 같은 이름이 지정됩니다 :어떻게 Perl로 파일의 이름을 일괄 적으로 바꿀 수 있습니까?

파일 이름 01

파일 이름 (100)

파일 이름 02

파일 이름 03

등, 내가하고 싶은 dd는 "0"(제로)과 같이, 100 미만입니다 해당 파일의 뒤에 :

파일 이름 001

파일 이름 (100)

파일 이름 002

파일 이름 003

가장 가까운 항목은 다음과 같습니다. find-type d | sort -r | grep '[1-9] [0-9] $'그러나 나는 그들을 대체하는 방법을 알아낼 수 없었다. 귀하가 저에게 제공 할 수있는 도움에 미리 감사드립니다. CentOS에임이 있다면 도움이된다.이 모든 것은 SSH를 통해 이루어지고있다.

+0

당신의 파일 이름이 실제로 공백을 포함 함 실제 이름 변경을 할 수? –

+0

예, 그들은 다음과 같이 나타납니다. "파일 이름 01" "파일 이름 101" –

+1

컴퓨터에서 사용할 수있는 "도구"에 대해 자세히 설명해 주시겠습니까? 펄, 파이썬, 루비 또는 비슷한 것을 설치 했습니까? –

답변

12
perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}' 

조금 지나치게 많을 수도 있지만 질문하는 것입니다.

0

나는 mmv이 당신의 친구라고 생각합니다.

9
find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e' 

또는 그런 일이, 당신은 (-print0-0을위한) GNU 찾아 GNU xargs를

  • 당신은 펄과 함께 제공되는 '이름 바꾸기'유틸리티는
  • 있다 한 한
    1. 제공 파일 이름에 하나의 숫자 그룹 만 있습니다. 하나 이상의 값이있는 경우 정규 표현식을 사용하여 다시 포맷하려는 숫자와 만 일치하도록해야합니다. 이 순서에서 두 명령
  • +0

    그건 내가 xargs 대신 sed를 사용하여 제안하려고했던 것과 가깝기 때문에 +1 할 것입니다. – shoover

    +0

    나는 xargs가가는 길을 알았다. 나는 정확한 명령을 쓸 수 없었다. –

    +0

    +1 목록의 종속성 (아마도 당신이 언급 한 이름 바꾸기 유틸리티가 yum이거나 apt-get away 일 것입니다). – ChristopheD

    2

    실행 :

    $ rename 's/File Name (\d)$/File Name 0$1/' * 
    $ rename 's/File Name (\d\d)$/File Name 0$1/' * 
    

    첫 번째는 10 이하의 모든 이름을 바꾸고 0을 앞에 추가합니다. 두 번째 것은 100보다 작은 모든 것을 재 명명하고 0을 앞에 붙입니다. 결과는 모든 파일 이름에 대해 세 자리 여야합니다.

    +0

    유효한 명령은 어떤 환경입니까? –

    +0

    'rename '은 표준 perl 배포판에있는 유틸리티입니다. Linux Bash에서이 파일을 실행했습니다. –

    +0

    [$는 명령 프롬프트를 나타냅니다.] –

    0

    당신은 펄이나 루비를 사용하여 무엇인가 할 수 있습니다.

    는 같은 디렉토리

    dirlisting = DIR.entries('.') 
    
    dirListing.each do |file| 
    num = file.match(/\d+$/).to_i 
    if num < 100 
        find the position where start the number, with index and inject the 0 there. 
    end 
    end 
    
    +0

    아마도이 코드는 루비이고 펄이 아니라는 것을 언급해야합니다. –

    +0

    내 문장을 읽으면 "펄 또는 루비"가 나타날 것입니다 –

    +0

    그래서 나는 당신이 코드가 루비라는 사실. –

    4

    이 한 번 일이되어이 모든 파일을 넣어? 그렇다면 여기서 많은 프로그래머가 경찰이 될 수있는 내용을 제안하려고합니다.

    명령 출력 (find -type d | sort -r | grep ' [1-9][0-9]$')을 파일로 파이프하고 일부 전역 검색/바꾸기와 함께 편집기를 사용합니다 마술을 사용하여 이름을 바꾸는 스크립트를 만듭니다.

    그런 다음 스크립트를 버리십시오.

    영리한 (그러나 부적절하게 디버그 된) 한 줄짜리 한 줄자를 파일의 잡초로 옮겨서 다리에서 자신을 총으로 쏘아 죽일 가능성은 거의 없습니다.

    +0

    ++! 때로는 "깊은 마법"을 배우는 것보다 이해하는 괴물을 사용하는 것이 더 낫습니다. – daotoad

    +0

    +1 이런 종류의 일은 종종 하나의 요구 사항에 대한 가장 실용적인 해결책이라고 생각합니다. –

    +0

    경찰관일지도 모르지만 그것은 안전한 경찰관 ... 명성입니다. –

    0
    use strict; 
    use File::Copy; 
    
    my @files = glob 'File*Name*'; 
    
    foreach my $filename (@files) { 
        if ($filename =~ m`^.*File.*Name.*?(\d+)`) { 
         my $number = $1; 
         next if ($number > 99); 
         rename $filename, sprintf("FileName%03d",$number); 
        } 
    } 
    
    +0

    'File Name 100'의 이름이 의도하지 않은 'File Name 0100'으로 변경되었습니다. –

    +0

    당신은 가장 옳았습니다. 일어날 수 없도록 몇 가지 코드를 추가했습니다. –

    1

    내 데비안에서는 파일 이름을 바꾸고 300 개의 파일로 테스트했습니다.

    perl -e 'map `touch door$_.txt`, 1..300;' 
    rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt 
    
    0

    원격가 bash 쉘이있는 경우

    for i in File*; 
    do 
        case "${i##* }" in [0-9][0-9]) 
         echo mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;; 
        esac; 
    done 
    

    제거 "에코"는

    관련 문제