하나의 명령으로 파일 그룹 이름 바꾸기


38

확장자가 .htm 인 파일 그룹이있는 경우 파일 이름을 모두 .html로 바꾸려면 어떻게해야합니까?

mv *.htm *.html

작동하지 않습니다.


완전성을 위해 ren *.htm *.htmlWindows에서 작동합니다.
Brian Burns

답변:


50

또는 순수한 bash를 사용할 수 있습니다 ... (mv 제외, 즉 ..)

for file in *.htm; do mv "$file" "${file%.htm}.html"; done

불쾌한 기본 이름을 피하십시오. ;)

Bash에는 광범위한 변수 확장 옵션이 있습니다. 여기에 사용 된 '%'는 변수 값에서 일치하는 가장 작은 접미사를 제거합니다. 패턴은 glob 패턴이므로 ${file%.*}작동합니다. '%%'연산자는 가장 큰 일치하는 접미사를 제거하고 위의 예에서 패턴이 수정되면 ${file%%.*}.htmlabhtm을 a.html로 바꿉니다.

더 깔끔한 트릭은 bash 맨 페이지의 변수 서브 섹션 섹션을 참조하십시오. bash 내에서 직접 수행 할 수있는 것이 많이 있습니다.


1
또한 이러한 매개 변수 확장은 bash로 제한되지 않습니다 . 모든 Bourne 파생 쉘 ( sh , ksh , bash , zsh , dash , ash 등)에서 사용할 수 있습니다. 확장은 “Shell Command Language”에 대한 POSIX 사양 의 일부이며 이식성이 뛰어납니다.
Chris Johnsen

11

파일 이름에는 공백, 줄 바꿈 또는 기타 공백이 없어야하지만이 버전의 freiheit 답변은 그 공백을 처리합니다. 또한 $()다른 장점과 함께 가독성을 위해 백틱 대신에 사용 합니다.

for file in *.htm
do
    mv "$file" "$(basename "$file" .htm).html"
done

더 나은-끝에 추가하는 특별한 경우 :

for file in *.htm
do
    mv "$file" "${file}l"
done

11

rename(1)정확히 원하는 것을 수행하는 Perl 유틸리티입니다. 이 경우 :

rename 's/\.htm$/.html/' *htm

또는 하위 디렉토리를 사용하는 경우

(Bash 4.0 및 globstar 설정이 필요합니다. shopt -s globstar)

rename 's/\.htm$/.html/' **/*htm


1
이름 바꾸기가 더 쉽지만 표준 유닉스 프로그램은 아닙니다. 원래 질문은 어떤 유닉스를 지정하지 않습니다. 어떤 곳에서는 "사전 이름"인 것 같습니다.
freiheit

2
rename펄과 함께 제공되며 기본적으로 모든 유닉스는 펄과 함께 제공됩니다.
TRS-80

3
예, 그러나 모든 유닉스가 시스템에 perl을 넣을 때 '이름 바꾸기'와 같은 보조 프로그램을 포함하는 것은 아닙니다. 예를 들어, OSX에는 "이름 바꾸기"가 없습니다.
freiheit

1
@William : 이중 별표 구문은 Bash 4 이상에서만 사용할 수 있으며 켜져있는 경우에만 shopt -s globstar(기본적으로 해제되어 있음) 또한 Linux 및 Unix에는 폴더가 아닌 디렉토리가 있습니다.
Dennis Williamson

6
for file in *.htm; do
  mv $file `basename "$file" .htm`.html
done

처음으로 echo앞에서 시도하십시오 mv.

원본의 문제는 " mv *.htm *.html"이 (가) *셸에서 처리 한 mv것이므로이 명령은 현재 디렉토리의 모든 .htm 및 .html 파일 목록을 볼뿐입니다. 즉, " mv foo.htm bar.htm stuff.htm six.htm file.htm" 와 같은 것 입니다. mv는 마지막 인수가 디렉토리 인 경우 두 개 이상의 인수를 처리하는 방법 만 알고 있습니다.


1
공백을 처리하려면 "$ file"을 인용해야합니다.
Richard Hoskins

원래 문제에 대한 설명을 더 강조해야합니다. 이 셸 와일드 카드 확장 동작은 Windows Land에서 온 사용자에게는 놀라 울 정도로 직관적이지 않으며 셸이 무엇을 이해하는지에 따라 원래 응용 프로그램이 mv작동하지 않는 이유가 명확 해집니다 .
Greg Hewgill

3

문자열 바꾸기를 사용하는 또 다른 순수한 bash 예제.

for file in *.htm; do mv $file ${file/htm/html}; done

추가-문자열의 모든 항목을 대체합니다

for file in *.htm; do mv $file ${file//htm/html}; done



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