2010-03-31 4 views
6

모든 파일과 디렉터리의 이름을 재귀 적으로 바꿔야합니다. 공백을 변환하여 모든 파일/디렉토리 이름을 소문자로 만듭니다. 다음 스크립트가 한 번에 모든 파일의 이름을 바꿀 수있게하려면 어떻게합니까? 현재 스크립트는 모든 파일/디렉토리가 변환되기 전에 여러 번 실행해야합니다. 코드는 다음과 같습니다 :Perl : 모든 파일과 디렉터리의 이름을 재귀 적으로 바꿉니다.

#!/usr/bin/perl 

use File::Find; 

$input_file_dir = $ARGV[0]; 

sub process_file { 
     $clean_name=lc($_); 
     $clean_name=~s/\s/_/g; 
     rename($_,$clean_name); 
     print "file/dir name: $clean_name\n"; 
} 
find(\&process_file, $input_file_dir); 
+2

"일부 파일 이름"과 "some_filename"이 같은 디렉토리에 있으면 어떻게해야합니까? 그리고 비어 있지 않은 디렉토리들에 대해 "Some Dir"과 "some_dir"은 같은 부모를 가지고 있습니까? –

+0

펄 이름 바꾸기 (3) 스크립트가 있다는 것을 알고 계십니까? –

+0

@Pasi : "prename"입니다. 어떤 이유로, 평소와 같이, 데비안은 사물을 무너 뜨리고 이름을 "rename"으로 바꾸고, 원래의 이름을 userlinux에서 바꾸기로 결정했습니다. – Juliano

답변

4

당신 하나가 찾거나 finddepth 전화를 통과 옵션에 bydepth => 1을 지정해야합니다.

bydepth

는 모든 항목이보고 된 후에 만 ​​디렉토리의 이름을보고합니다 : perldoc File::Find에서. 진입 점 finddepth()find()의 첫 번째 인수에 { bydepth => 1 }을 지정하기위한 바로 가기입니다.

그러나 은 여전히 ​​대상이을 존재하는 경우 이름 변경 대상을 소지품 때문에 이름 충돌을 처리하는 방법을 결정해야합니다. 다른 접근 방법에 열려있는 경우

#!/usr/bin/perl 

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

finddepth(\&process_file, $_) for @ARGV; 
1

, 다음은 디렉토리를 통해 통과하기 전에 파일 이름을 바꿀 수 있습니다 파이썬 솔루션을

import os 
for R,DIR,FILES in os.walk("/mypath",topdown=False): 
    for file in FILES: 
     newfile=file.lower().replace(" ","_") 
     new_file_name=os.path.join(R,newfile) 
     os.rename(os.path.join(R,file) , new_file_name) 
    for dir in DIR: 
     newdir=dir.lower().replace(" ","_") 
     new_dir_name=os.path.join(R,newdir) 
     os.rename(os.path.join(R,dir) , new_dir_name) 
+0

위의 스크립트를 사용했는데 완벽하게 작동하는 것을 볼 수 있습니다. 이 공유 주셔서 감사합니다 :) – Horizon

0

을합니다.

find({ 
     preprocess => sub { 
      for (@_) { 
       my $oldname = $_; 
       $_ = lc; 
       s/\s/_/g; 
       rename $oldname => $_; 
      } 
      return @_; 
     }, 
     wanted => sub { 
      print "$File::Find::name was already renamed\n"; 
     }, 
    }, 
    @dirs 
); 

또는 탐색이 발생할 때까지 이름을 지연시킬 수 있습니다.

find이 존재하지 않는 "Abc Def"를 입력 할 디렉토리를 "Abc Def"
find 전화 wanted("Abc Def")
      rename "Abc Def" => "abc_def"
find 시도를 발견하기 때문에

finddepth(sub { 
     print "in $File::Find::dir, renaming $_\n"; 
     my $newname = lc; 
     $newname =~ s/\s/_/g; 
     rename $_ => $newname; 
    }, 
    @dirs 
); 

는 발생한 문제는 더 이상
      아래의 모든 항목이 처리되지 않습니다.

관련 문제