it-swarm-ko.com

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

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

mv *.htm *.html

작동하지 않습니다.

38
Richard Hoskins

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

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

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

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

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

50
falstro

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

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

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

(Bash 4.0 및 globstar 설정 필요 : shopt -s globstar)

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

11
TRS-80

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

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

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

for file in *.htm
do
    mv "$file" "${file}l"
done
for file in *.htm; do
  mv $file `basename "$file" .htm`.html
done

처음으로 echo 앞에서 mv를 사용하여 시도해보세요.

원본의 문제는 "mv *.htm *.html "에는 *s는 쉘에 의해 처리되므로 mv 명령은 현재 디렉토리에있는 모든 .htm 및 .html 파일 목록을 표시합니다. 즉, "mv foo.htm bar.htm stuff.htm six.htm file.htm ". mv는 마지막 인수가 디렉토리 인 경우 2 개 이상의 인수를 처리하는 방법 만 알고 있습니다.

6
freiheit

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

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

Extra-문자열의 모든 항목을 대체합니다.

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

Zsh 를 사용하면 'zmv'를 사용할 수 있습니다.

1
Martin

가장 좋은 도구는 mmv 입니다.

mmv \*.htm #1.html

" GNU/Linux 명령 줄 도구 요약 "의 기타 사용 예 (및 기타 도구).

1
bortzmeyer

util-linux-ng 패키지 (Fedora)에는 TRS-에서 언급 한 것과 유사한 rename 명령이 있습니다. 8 . 다음과 같이 사용할 수 있습니다.

rename .htm .html *.html
0
Cristian Ciupitu