it-swarm-ko.tech

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

파일 확장자를 *.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
192
afbr1201

Greg 's Wiki 에서 바로 :

 # * .txt에서 f에 대해 * .txt를 모두 * .text 
로 바꾸십시오. 
 mv- "$ f" "$ {f % .txt} .text"
 완료 

또한 왜 ls 를 구문 분석하지 않아야하는 항목도 참조하십시오.

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

* .txt에서 f의 경우 
; do 
 mv- "$ f" "$ (기본 이름-"$ f ".txt) .text"
 완료 
211
jasonwryan

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

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

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

157
Matthias Braun

간단한 명령 인 rename from util-linux , 이렇게하면 "* .txt"와 일치하는 모든 파일에서 "txt"의 모든 발생을 "text"로 바꿉니다.

rename txt text *.txt
43
lamwaiman1988
rename "s/oldExtension/newExtension/" *.txt

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

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

여기에서 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
12
wisbucky
for f in *.txt
do
    [ -f "$f" ] && mv "$f" "${f%txt}text"
done
9
Prince John Wesley

@Prince John Wesley의 답변을 바탕으로 현재 디렉토리의 모든 파일 확장자를 ext1에서 ext2. 또한 이름이 바뀐 파일의 이름을 출력합니다.

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

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

change-ext ext1 ext2
8
Dennis Golomazov

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

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

7
Burrito

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

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

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

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

때를

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

대상 확장은 . text이 방법으로 수행합니다-

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

버전에서 어떤 문제가 발생했는지 알고 싶은 경우 : basename 명령에서 $files 대신 $x를 사용했습니다. 따라서 이것은 작동해야합니다 (그렇지 않은 경우)

for x in *.txt
do
  mv "$x" "`basename '$x' .txt`.text"
done
1
daniel kullmann