2014-02-24 3 views
42

디렉토리를 반복적으로 반복하고 특정 확장자의 모든 파일 (예 : .t1)의 확장자를 .t2으로 변경하고 싶습니다. 이렇게하기위한 bash 명령은 무엇입니까? 사용 가능한 이름을 변경하는 경우Bash에서 파일 확장자를 재귀 적으로 변경합니다.

+6

imho 이것은 중복 질문이 아닙니다. 다른 질문은 재귀가 아닙니다. –

답변

102

후 사용

find . -name "*.t1" -exec rename 's/\.t1$/.t2/' '{}' \; 

을 이름 바꾸기를 사용할 수없는 경우 사용

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' \; 
+10

'find. -name '* .t1'-exec rename .t1 .t2 {} +' –

+2

(내 버전의'rename'은 sed 스타일 대체 표현식을 허용하지 않습니다.) Linux를 좋아합니다. 저는 Windows 용 TotalCommander를 설치해야했습니다. 이런 일을하십시오.) –

+1

추한'sed' 대신에 매개 변수 확장을 사용하십시오! –

1

내가 bash는 이런 식으로 할 것 :

for i in $(ls *.t1); 
do 
    mv "$i" "${i%.t1}.t2" 
done 

편집 : 내 실수 : 재귀 적, 여기 재귀 적 변경 파일 이름에 대한 내 길을있다 :

for i in $(find `pwd` -name "*.t1"); 
do 
    mv "$i" "${i%.t1}.t2" 
done 
+7

[ls을 구문 분석하지 마십시오.] (http://mywiki.wooledge.org/ParsingLs),'find' 구문이 왜 나쁜지에 대한 동일한 페이지를보십시오. 또한 [변수를 인용하십시오] (http://mywiki.wooledge.org/BashGuide/Practices#Quoting) – BroSlow

+2

감사합니다. 나는 몰랐습니다. – jrjc

6

또는 당신은 단순히 mmv 명령을 설치하고 수행 할 수 있습니다

다음
mmv '*.t1' '#1.t2' 

#1*.t1에서 * 최초의 글로브 부분입니다.

또는 순수 bash는 물건에

는 간단한 방법은 다음과 같습니다

for f in *.t1; do 
    mv "$f" "${i%.t1}.t2" 
done 

(예 : forls 또는 find와 같은 외부 명령의 도움없이 파일을 나열 할 수 있습니다)

HTH

+4

OP의 "재귀 적"사용은 디렉토리의 하위 디렉토리에도있는 파일의 이름을 바꾸는 것을 의미한다고 가정합니다. – chepner

+0

죄송하지만, # 1의 의미는 무엇입니까? – inafalcao

+1

첫 번째 glob 부분, 즉'* .t1'의'* ' – zmo

7

bash 버전이 globstar 옵션 (버전 4 이상)을 지원하는 경우 :

shopt -s globstar 
for f in **/*.t1; do 
    mv "$f" "${f%.t1}.t2" 
done 
관련 문제