여러 파일의 확장자를 어떻게 변경합니까?


166

파일 확장자를에서 (으) *.txt로 변경하고 싶습니다 *.text. basename명령을 사용하려고 시도했지만 둘 이상의 파일을 변경하는 데 문제가 있습니다.

내 코드는 다음과 같습니다.

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done

이 오류가 발생합니다.

basename: too many arguments Try basename --help' for more information

답변:


175

직선에서 그렉의 위키 :

# 모든 * .txt의 이름을 * .text로 바꿉니다.
* .txt에서 f의 경우; 하다
    mv- "$ f" "$ {f % .txt} .text"
끝난

구문 분석하지 않아야ls 하는 이유에 대한 항목도 참조하십시오 .

편집 : basename구문 을 사용해야하는 경우 다음과 같습니다.

* .txt에서 f의 경우; 하다
    mv- "$ f" "$ (기본 이름-"$ f ".txt) .text"
끝난

48
여기에 설명없이 약간 고급 Bash 구문이 사용되었습니다. 나는 이것을 완전히 이해하기 위해 많은 것들을 Google에해야했습니다. 내 위치에 다른 사람을 돕기 위해 여기에 대한 몇 가지 참조입니다 globs의합니다 ( *.txt구문)베어 이중 대시--내에서 % 기호를 사용하는 ${}구조는 . 지금까지 나는 후자를 만난 적이 없었고 실제로 전자와 무슨 일이 있었는지 알지 못했습니다.
Mark Amery

3
아래에서 Matthias Braun의 답변을 살펴보십시오. 훨씬 간단하고 동일한 결과를 얻습니다.
btk

10
하나의 라이너for f in *.txt; do mv -- "$f" "${f%.txt}.text"; done
Marçal Juan

1
당신은 실종되었다; 텍스트 후 ".
Pétur Ingi Egilsson

2
두 번째 줄에 @ PéturIngiEgilsson? 아니요, 필요하지 않습니다.
jasonwryan

132

데비안의 현재 디렉토리에서 모든 파일 확장자를 변경하는 방법은 다음과 같습니다.

rename "s/oldExtension/newExtension/" *.txt

(이것은 Perl rename명령이 아닙니다 util-linux. Debian / Ubuntu의 이름 바꾸기 유틸리티가 CentOS와 같은 다른 배포판의 이름 바꾸기 유틸리티와 다른 이유는 무엇입니까?를 참조하십시오 )


10
허용되는 답변보다 훨씬 간단합니다. 감사합니다!
btk

8
Mac에서 나는 brew install rename이것을 작동 시킬 수있었습니다 .
Monkpit

3
생선 껍질을 사용하면 rename "s/oldExtension/newExtension/" **.txt모든 * .txt의 이름을 재귀 적으로 바꿀 수 있습니다
Palmstrom

3
이 실패합니다 footxt.txt. 이 대신에 사용 unix.stackexchange.com/questions/19654/...을
wisbucky

7
파일에 확장자가없고 확장자를 추가하려는 경우 :rename 's/$/.txt/' *
mkataja

34

renamefromutil-linux 명령은 간단한 명령으로 "* .txt"와 일치하는 모든 파일에서 "txt"의 모든 발생을 "text"로 바꿉니다.

rename txt text *.txt

4
rename첫 번째 항목이 변경, 그래서 더 나은 것을 만들 rename .txt .text(예를 들어,이 이름을 변경,하지만 여전히 항상 작동하지 않습니다 foo.txtx.bar.txtfoo.textx.bar.txt).
Gilles

12
모든 시스템이 동일한 버전의 이름 변경을 갖는 것은 아닙니다. 데비안과 친구들에게 rename명령은 실제로 perl-rename펄 정규식을 사용합니다. 이를 위해 동등한 명령은 다음과 같습니다 rename 's/.txt/.text/' *.txt.. 사람들은 man rename자신의 시스템을 확인하여 어떤 시스템 이 있는지 확인해야합니다 .
evilsoup

@evilsoup 이것이 OSX, thx의 경우입니다
Davi Lima

이것은 또한 Cygwin에서 (윈도우)에서 작동
앤디

27
rename "s/oldExtension/newExtension/" *.txt

위는 잘 작동하지만 현재 디렉토리로 제한됩니다. 하위 디렉토리에 융통성이있는 아래 명령을 시도하십시오. .txt디렉토리 구조에있는 모든 파일의 이름을 새 확장자로 바꿉니다 .

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

2
rename여러 파일을 인수로 처리 할 수 ​​있습니다. 이러한 파일이 많은 경우 +대신 대신 사용하여 작업 속도를 크게 높일 수 \;있습니다.
Anthon

"* .txt"가 쉘에서 지원하지 않는 큰 인수 목록으로 언 롤링 할 수 있기 때문에 여전히 유용한 옵션입니다.
Roman Shapovalov

1
"s / oldExtension / newExtension /"에 실패합니다 footxt.txt. 이 대신에 사용 unix.stackexchange.com/questions/19654/...을
wisbucky


9

여기에 언급 된 답변 s/oldExtension/newExtension/이 잘못되었습니다. 을 사용 s/txt/text/하면으로 변환 footxt.txt됩니다 footext.txt. 원하는 형식이 아닙니다. 를 사용하더라도 s/.txt/.text/로 변환 footxt.txt됩니다 fo.text.txt.

\.마침표를 일치시키는 데 사용해야 합니다 ( .모든 문자와 일치 함). 그리고 $끝은 줄의 끝과 일치합니다. 이것 만이 확장과 올바르게 일치합니다.

rename 's/\.txt$/.text/' *.txt

rename 's/\.old$/.new/' *.old

7

@Prince John Wesley의 답변을 바탕으로 현재 디렉토리의 모든 파일 확장자를에서로 변경하는 간단한 bash 스크립트 ext1ext2있습니다. 또한 이름이 바뀐 파일의 이름을 출력합니다.

#!/bin/bash
for f in *.$1
do
    [ -f "$f" ] && mv -v "$f" "${f%$1}$2"
done

사용법 예 (스크립트 이름이이라고 가정 change-ext) :

change-ext ext1 ext2

디렉토리의 파일 확장자를 재귀 적으로 변경하려면 두 번째 줄 ( for...)을 두 줄로 바꿉니다 : shopt -s globstarfor f in **/*.$1. 배쉬 4+가 필요합니다.
Dennis Golomazov 2019

4

# 53을 zsh로 전환해야하는 이유 :

zmv '(*).txt' '$1.text'


3

파일이 다양한 디렉토리에 흩어져 있다고 가정 해 봅시다. dirx가 부모 디렉토리라고 가정하면 find를 사용하여 작업을 수행 할 수 있습니다.

for f in `find /dirx -iname '*.txt' -type f -print`;do  mv "$f" ${f%.txt}.text; done

tcsh는 어떻습니까?
Josef Klimuk

2

이것이 나를 위해 작동하는 것입니다.

find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;

1
를 추가하십시오. "텍스트"전에
danielmhanover

2

때를

소스 파일의 확장자가 없습니다

대상 확장자는 .text 입니다.이 방법으로 수행하십시오.

for f in *; do mv -- "$f" "${f%.\*}.text"; done

1
훌륭한 bash 기본 스크립트. 잘했다! for f in *.html; do mv -- "$f" "${f%.\*}.pug"; done
TamusJRoyce

1

버전에서 무엇이 잘못되었는지 알고 싶은 경우 : basename 명령 $files대신에 사용 했습니다 $x. 따라서 이것은 작동해야합니다 (그렇지만 예상되지 않음).

for x in *.txt
do
  mv "$x" "`basename '$x' .txt`.text"
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.