여러 파일의 확장자를 변경하는 방법은 무엇입니까?

여러 파일의 확장자를 변경하는 방법은 무엇입니까?

파일 확장자를 에서 으로 변경하고 *.txt싶습니다 *.text.basename명령을 실행했지만 여러 파일을 변경하는 데 문제가 있습니다.

이것은 내 코드입니다.

files=`ls -1 *.txt`

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

다음 오류가 발생합니다.

basename: 인수가 너무 많습니다. 자세한 내용을 보려면 basename --help'를 시도해 보세요.

답변1

직접적으로그렉의 위키:

# Rename all *.txt to *.text
for file in *.txt; do
    mv -- "$file" "${file%.txt}.text"
done

*.txt와일드카드 패턴, *임의의 문자열과 일치시키기 위해 와일드카드로 사용됩니다. *.txt".txt"로 끝나는 모든 파일 이름과 일치합니다.

-- 옵션 목록의 끝을 표시. 이렇게 하면 하이픈으로 시작하는 파일 이름과 관련된 문제를 방지할 수 있습니다.

${file%.txt}매개변수 확장, 끝에서 제거된 변수 값으로 대체됩니다 file..txt

이유에 대한 항목도 참조하세요.파싱하면 안 된다ls.

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

for file in *.txt; do
    mv -- "$file" "$(basename -- "$file" .txt).text"
done

답변2

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

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

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

MacOS에서는 사용자가수도사 피트보고서는 그들이 brew install rename이 목표를 달성하기 위해 이를 활용할 수 있었다고 말합니다.

답변3

간단한 명령,rename~에서util-linux, 당신을 위해 이것을 해줄 것입니다. "*.txt"와 일치하는 모든 파일에서 "txt"를 모두 "text"로 바꿉니다.

rename txt text *.txt

답변4

여기에 인용된 답변은 s/oldExtension/newExtension/잘못되었습니다. 을 사용하면 원하는 대로 s/txt/text/변환되지 footxt.txt않습니다 . footext.txt를 사용해도 로 s/.txt/.text/변환됩니다 .footxt.txtfo.text.txt

마침표를 일치시키려면 을 사용해야 합니다 \.( .모든 문자와 일치함). 후행은 $줄의 끝과 일치합니다. 그래야만 확장자가 올바르게 일치할 수 있습니다.

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

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

관련 정보