Bash에서 재귀 적으로 파일 확장자 변경


87

내가 디렉토리를 통해 반복을 반복적으로하고 특정 확장자의 모든 파일의 확장자를 변경하고자하는 말 .t1.t2. 이를 수행하기위한 bash 명령은 무엇입니까?


14
이럴이 중복 된 질문은하지 않습니다 - 다른 질문은 재귀하지 않습니다
shonky 리눅스 사용자

답변:


207

이름을 변경할 수있는 경우 다음을 사용하십시오.

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

그렇지 않으면:

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

이름을 바꿀 수없는 경우 다음을 사용하십시오.

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

20
find . -name '*.t1' -exec rename .t1 .t2 {} +
Aaron Blenkush

2
(내 버전은 renamesed의 스타일 대체 표현을 허용하지 않습니다 가야 사랑 리눅스를이 같은 물건을 할 Windows 용 토탈 커맨더를 설치해야하는 데 사용됩니다...)
아론 Blenkush에게

6
누군가 "${1%.t1}".t2내가했던 것처럼 부분이 무엇을하는지 궁금해하는 경우 : bash 문자열 조작을 사용하여 다음을 수행합니다. 1 / 첫 번째 위치 매개 변수를 취하고 $1끝에서 .t1문자열 리터럴을 자릅니다 (퍼센트 기호 %연산자). 2 / .t2결과에 문자열 리터럴을 추가합니다 .
Zack

2
이름 바꾸기는 OSX에서 저에게 효과가 없었지만 bash 버전은 굉장합니다 b / c 방금 mv 앞에 'git'을 추가했고 이제 git는 행복합니다 :-D
bdombro

3
사용자에게 선호 find . -type f -name '*.t1'피하기 폴더
Golak 아니라 Sarangi에게

8

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

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

7

또는 간단히 mmv명령을 설치하고 다음을 수행 할 수 있습니다 .

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

다음 #1은 첫 번째 glob 부분 *입니다 *.t1.

또는 순수한 bash의 경우 간단한 방법은 다음과 같습니다.

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

(예 : 또는 for같은 외부 명령의 도움없이 파일을 나열 할 수 있음 )lsfind

HTH


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

미안하지만 # 1의 의미는 무엇입니까?
inafalcao 2017-06-02

1
그것은 첫 번째 glob 부분 즉 *in*.t1
zmo

재귀 적으로 : $ mmv -n ';*.t1' '#1#2.t2'. -n실행할 플래그 제거
okliv

5

나는 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

8
ls 구문 분석하지 말고find 구문이 잘못된 이유에 대해 동일한 페이지를 참조하십시오 . 또한, 메이크업 확실히 당신은 당신의 변수를 인용
분석 재개 모니카하십시오

2
고마워, 몰랐어.
jrjc 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.