2009-09-08 4 views
61

바보 같은 질문으로 미안하지만, 나는 꽤 초보자입니다. I는 다음과 같이 파일의로드가 있습니다파일 이름의 일부를

DET01-ABC-5_50-001.dat 
... 
DET01-ABC-5_50-0025.dat 

을하고 나는 그들이 같이 할 :

DET01-XYZ-5_50-001.dat 
... 
DET01-XYZ-5_50-0025.dat 

내가 이것을 어떻게 할 수

? 나는이 포럼에서 몇 가지 일을 시도했지만 실수 한 것처럼 보입니다. 도움 주셔서 감사합니다.

답변

123

이 당신은 펄 정규식 걸리는 버전이있을 수 있습니다 간단

rename ABC XYZ *.dat 

로 이름 변경 명령의 변종 부부, 귀하의 경우, 그것은 할 수있다;

rename 's/ABC/XYZ/' *.dat 
+0

+1 가장 간단한 방법 – rangalo

+0

감사합니다! 그게 쉬웠어요 (만약 당신이 ;-)) 방법을 알고 –

+2

Welcome to stackoverflow! –

3

당신은 http://www.cyberciti.biz/faq/bash-for-loop/

다음과 같이 보일 것입니다 귀하의 명령, 나는이없는 파일 항목을 통해 루프 그래서 당신이 할 수있는 사용도 나오지 http://unixhelp.ed.ac.uk/CGI/man-cgi?sed

를 사용하는 방법을 배울 필요가 있습니다 내 옆에있는 용어 때문에 확인할 수 없네.

for i in `dir` do mv $i `echo $i | sed '/orig/new/g'` 
1

나는 이것을 sed로하고 싶다. 당신의 경우 :

for x in DET01-*.dat; do 
    echo $x | sed -r 's/DET01-ABC-(.+)\.dat/mv -v "\0" "DET01-XYZ-\1.dat"/' 
done | sh -e 

이 실행됩니다 무엇을보고 먼저 "쉬 -e"부분을 생략하는 것이 가장 좋습니다.

+0

어쩌면 내가 잘못하고있는 것이지만 내 파일에는 아무런 변화가 없습니다. –

+0

"sh -e"의 유무에 관계없이 사용해 보시겠습니까? 그것 없이는 노력하지 않으면 안됩니다. 그냥 실행될 내용 ("mv -v ... ..."행)을 인쇄하여 모든 것이 정상인지 확인할 수 있습니다. 당신이 보는 것을 좋아한다면 "sh -e"를 추가하십시오. – stribika

6

이렇게하면됩니다. for 루프는 캡처 할 파일 이름에 따라 수정해야 할 수도 있습니다.

for fspec1 in DET01-ABC-5_50-*.dat ; do 
    fspec2=$(echo ${fspec1} | sed 's/-ABC-/-XYZ-/') 
    mv ${fspec1} ${fspec2} 
done 

당신은 항상 그런데, 사본 데이터의에서 이러한 스크립트를 테스트하고, 완전히 다른 디렉토리에 있어야합니다.

+0

for this osx this stuff. 멋진 이름 바꾸기,하지만 이름 바꾸기의 양조 설치는 위의 예제에 따라 작동하지 않는 펄 스크립트를 설치하는 것 같습니다. 일부 인터넷 검색은 이름 바꾸기가 모든 Linux 버전에서 사용 가능하지 않으며 infact에 perl 버전이 떠 다니고 있음을 나타냅니다. 차이를 분류하고 결정하기 위해 약 10 분이 있습니다.이 답변은 충분히 쉽습니다. :) – j03m

1

모든 답변은 간단하고 좋습니다. 그러나 필자는 이러한 스크립트에 대화 형 모드를 추가하여 잘못된 검색을 찾을 수 있습니다.

경우 [[-n $ inInteractiveMode]

    에코 -e -n "$ oldFileName => $ NEWFILENAME 은도 \ 당신이 변경을 수행하는 [Y/N]를 원하는?"
    읽기 실행

    [[-z $ 실행 || "$ run"== "y"|| "$ 실행"== "Y"]] & & MV "$ oldFileName" "$ NEWFILENAME"
Fi를

또는 힘 플래그를 기본 대화 형 모드를 확인하고 추가 (-f | --force) 자동화 된 스크립트 또는 대담한 느낌이들 경우 그리고 이것은 너무 느려지지 않습니다 : 기본 응답은 "예, 이름을 변경하고 싶습니다"이므로 각 프롬프트에서 Enter 키를 누르십시오 (`-z $ ​​run \ 테스트 때문에).

77
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done 

아니오 rename 또는 sed이 필요합니다. 그냥 bash parameter expansion.

+5

파일 이름에 공백이 있으면 따옴표를 사용해야합니다. 아래 스 니펫을 참조하십시오. * .dat에있는 파일의 경우 ; mv "$ file" "$ {file // ABC/XYZ}"하십시오; 완료 ' –

+0

OSX에서 훌륭하게 작동합니다. –

관련 문제