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

파일 확장자를에서 (으) *.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



답변

직선에서 그렉의 위키 :

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

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

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

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


답변

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

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

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


답변

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

rename txt text *.txt


답변

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

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

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


답변

for f in *.txt
do
    [ -f "$f" ] && mv "$f" "${f%txt}text"
done


답변

여기에 언급 된 답변 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


답변

@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