2011-11-30 7 views
3

디렉토리에 파일 이름 :일괄 이름 변경이 같은 이름을 가진 일부 파일이

01_dpm_gsi_182.sl5 
02_dpm_devel_gsi_182.sl5 
03_DPM_DSI_181.sl5 
04_globus_httpd_122.sl5 
05_globus_httpd_client_cgi_132.sl5 

을 내가 좋아하는 어떤 것을 얻을 수 있도록 내가, 그 파일의 이름을 바꿀 수있는 방법 :

01_dpmgsi_s2011e01.sl5 
02_dpmdevelgsi_s2011e02.sl5 
.... 
.... 

#!/usr/bin/perl -n 

if (/^([^_]+)_(.+)_([^.]+)([.].+)$/) { 
    my $s = $&; 
    my $x = $1; 
    my $y = $2; 
    my $z = 2011; 
    my $e = $4; 

    $y =~ s/_//g; 

    print "mv $s ${x}_${y}_s${z}e$x$e\n" 
} 

을 다음과 같이 사용 : 가장 가까운이 같은으로 제시했다

,536,913,632 10
# ls | perl -n reName.pl > output 
# bash ./output 

아마도 sed/awk를 사용하면 더 좋은 방법이나 한 줄짜리 방법이 있습니까? 건배!!

답변

6

파일에 mv에 bash 스크립트를 사용할 필요가 없으므로 perl이이를 수행 할 수 있습니다. 아래 스크립트는 그 목적으로 File::Copy을 사용합니다. 스크립트를 입력으로 먼저 테스트 할 수 있도록 이동을 수행하는 행을 주석 처리했습니다.

코드 :

use strict; 
use warnings; 
use v5.10; 

#use File::Copy; 
my $year = 2011; 
for (@ARGV) { 
    my ($pre, @p) = split /_/; 
    my $ext = pop @p; 
    $ext =~ s/.*\./s${year}e$pre./; 
    my $new = join '_', $pre, (join '', @p), $ext; 
    say "old: $_"; 
    say "new: $new"; 
    say "------"; 
    #move $_, $new or die $!; 
} 

사용법 :

perl script.pl *.sl5 

당신은 print와 버전 5.10, 교환 say을 가지고 줄 바꿈을 추가하지 않으면.

출력 :

old: 01_dpm_gsi_182.sl5 
new: 01_dpmgsi_s2011e01.sl5 
------ 
old: 02_dpm_devel_gsi_182.sl5 
new: 02_dpmdevelgsi_s2011e02.sl5 
------ 
old: 03_DPM_DSI_181.sl5 
new: 03_DPMDSI_s2011e03.sl5 
------ 
old: 04_globus_httpd_122.sl5 
new: 04_globushttpd_s2011e04.sl5 
------ 
old: 05_globus_httpd_client_cgi_132.sl5 
new: 05_globushttpdclientcgi_s2011e05.sl5 
+0

+1 'bash 스크립트 사용 불필요' – Toto

+0

간단하고 이해하기 쉽습니다! +1 –

1

이름을 변경하기 위해 별도의 bash 스크립트가 필요하지 않습니다. Perl에는 내장 된 rename 함수가 있습니다. 설명서는 http://perldoc.perl.org/functions/rename.html을 참조하십시오.

정규식에 대해서는 언급하지 않겠습니다. 그것을 향상시킬 수도 있지만 올바르게 작동하는 한 변경하지 않아도됩니다.

0

좋아, 당신은 한 - 라이너를 요청 :

ls |xargs -n1|awk -F'[_.]' '{idx=$1;nf=$1"_";for(i=2;i<NF-1;i++)nf=nf$i; nf=nf"_s2011e"idx"."$NF;print "mv "$0" "nf;}' 

이 당신을 위해 모든 mv 명령을 인쇄합니다.

대상 이름이 모두 정확하면 출력을 확인할 수 있습니다. 그렇다면 라인 끝에 "|sh"을 추가하기 만하면 이름이 바뀝니다.

테스트 |

kent$ ls |xargs -n1|awk -F'[_.]' '{idx=$1;nf=$1"_";for(i=2;i<NF-1;i++)nf=nf$i; nf=nf"_s2011e"idx"."$NF;print "mv "$0" "nf;}' 
mv 01_dpm_gsi_182.sl5 01_dpmgsi_s2011e01.sl5 
mv 02_dpm_devel_gsi_182.sl5 02_dpmdevelgsi_s2011e02.sl5 
mv 03_DPM_DSI_181.sl5 03_DPMDSI_s2011e03.sl5 
mv 04_globus_httpd_122.sl5 04_globushttpd_s2011e04.sl5 
mv 05_globus_httpd_client_cgi_132.sl5 05_globushttpdclientcgi_s2011e05.sl5 
+0

파일 처리시'ls' 출력을 파싱 하시겠습니까? 이것은 확실히 공백, 이상한 파일 이름, 등등에 끊을 것이다. 그것은 좋은 연습이 아니다. – Sorpigal

+0

@Sorpigal check OP의 예제 파일은 pls입니다. 과. awk 이전의 부분은 어떻게 작동하는지 보여주기위한 것입니다. 요점은 awk 부분입니다, 맞죠? 물론 find, xargs 등을 사용하여 공백을 처리 할 수 ​​있습니다. 그러나이 질문의 요점은 아닙니다. – Kent

+0

@Kent 단순히 글로브를 사용하는 것이 가능하지 않습니까? – TLP

1

has been covered before 이런 종류의를 (없이, 쉬 출력을 볼 수) 대답은 기존의 이름을 변경 utiliy를 사용하고 직접 작성하지 않는 것입니다.

+1

파일 조작 OP가 요구하는 것은 다소 복잡한 정규 표현식을 필요로합니다. Perl 스크립트가 여기에 적합하다고 생각합니다. – Jonathan

+0

@Jonathan : 그렇기 때문에 링크 된 답변에서 언급 한 것과 같이 Perl로 작성된 '이름 바꾸기'를 사용합니다. – ninjalj

2

이 GNU 나오지 솔루션은 당신을 위해 일 수 있습니다

sed 'h;s/[^_.]*\././;s/_//2g;s/^\(\([^_]*\)_[^.]*\)\./\1_s2011e\2e./;x;G;s/\(.*\)\n/mv -v \1 /' file 

설명 :

스토어 보류 영역 (HS)의 원래 파일 이름입니다. 파일 확장자 앞에있는 숫자를 제거하십시오. 먼저 _을 제외한 모든 것을 삭제하십시오. 그룹화, 역 참조 및 추가 된 텍스트를 사용하여 새 파일 이름을 만듭니다. HS로 교환하십시오. 새 파일 이름을 추가하십시오. mv -v 명령을 추가하고 포함 된 \n을 삭제하십시오.

이미 언급했듯이 파일 이름은주의를 기울일 수 있습니다.

+2

+1 나를 어지럽게 만들기. –

+0

+2 동일 (그러나 WOW !!) – MacUsers

2

omg, 절대로 ls의 출력을 구문 분석하거나 셸에서 다시 평가되는 쿼리를 작성하십시오. 파일 목록 (출력은 ls)은 공백 문자 (또는 $ IFS 변수에있는 문자)에 직면 할 수 없으므로 어쨌든 어색한 해결책입니다. 마찬가지로 이스케이프 처리 된 쉘 명령 행을 올바르게 빌드하는 것은 불가능합니다.

for i in ./* 
do 
    firstpart=${i%%_*} 
    num=${firstpart#./} 
    middlepart=${i#*_} 
    middlepart=${middlepart%_*} 
    middlepart=`printf %s "$middlepart" | tr -d _` 
    lastpart=s2011e"$num".sl5 
    echo mv "$i" "${firstpart}_${middlepart}_${lastpart}" 
done 

실제로 실행하려면, 마지막 줄에 echo를 제거 :

제대로 인수를 분할 글 로빙 파일을 사용, (그럼에도 불구하고이 작업을위한 훌륭한 도구입니다) 쉘 유지합니다.

+0

+1, 펄 스크립트가 필요하지 않습니다. – Sorpigal

+0

@Jo 그래서'ls' 출력에 대한 덧글은 +1하지만,이 특별한 경우에는 아무런 해가 없습니다. 내 모든 시간 좋아하는 쉘 스크립트에 대한 또 다른 +1. – MacUsers

관련 문제