디렉토리의 모든 파일 이름을 $ filename_h에서 $ filename_half로 바꾸시겠습니까?


139

간단하다.

이름을 바꾸려면 어떻게합니까

05_h.png
06_h.png

05_half.png
06_half.png

적어도, 나는 그것이 간단하다고 생각하지만, 당신이 이미 알지 않는 한 이런 종류의 일은 Google에 어렵습니다.

감사....

답변:


302

외부 명령을 호출 할 필요없이 bash를 사용하십시오.

for file in *_h.png
do
  mv "$file" "${file/_h.png/_half.png}"
done

추가하지 마십시오 #!/bin/sh

그 한 줄짜리가 필요한 사람들을 위해 :

for file in *.png; do mv "$file" "${file/_h.png/_half.png}"; done

7
배쉬의 좋은 사용이 내장되어있어 문자열 교체 나오지보다는
dandrews

3
/_h.png/_half.png 정규식은 무엇입니까?
user2799603

15
아니요, 형식은 $ {string / substring / substitution} – "처음으로 첫 번째 발생"입니다. 자세한 정보는이 치트 시트 (섹션 "문자열")를 확인하십시오. bruxy.regnet.cz/linux/bash_cheatsheet/bash_cheatsheet.pdf
WindRider

11
어떤 이유가 Do not add #!/bin/sh있습니까? 나는이 진술을 사용하거나 사용하지 않고 두 가지 모두를 시도했습니다.
Ryan

6
@Ryan @Ishan Jain 실제로 스크립트를 실행해야하는 백엔드 셸을 나타냅니다. sh와 bash는 다른 쉘이므로 스크립트 동작과 구문에 영향을 줄 수 있습니다. 스크립트는 bash 내장 문자열 대체를 사용하므로 header를 추가해야합니다 #!/bin/bash. bash는 일반적으로 많은 컴퓨터에서 기본 셸이므로 많은 차이점을 찾을 수는 없습니다 .D 자세한 정보는 여기를
Cristian Ramon-Cortes

65

rename명령을 시도하십시오 :

rename 's/_h.png/_half.png/' *.png

최신 정보:

사용법 예 :

내용을 만들다

$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch one_h.png two_h.png three_h.png
$ ls 
one_h.png  three_h.png  two_h.png

테스트 솔루션 :

$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png  three_half.png  two_half.png

1
@CarolineAlexiou : 예제 테스트 세션을 추가했습니다. 시도하십시오. 아마도 오타가있을 것입니다. 출력은 ls무엇입니까? rename ...당신 은 무엇 을 시도합니까?
Michał Šrajer

2
Mac의 bash에서는 작동하지 않습니다. rename표준 유닉스 도구가 아닙니다.
tandrewnichols 2016 년

1
@tandrewnichols, homebrew 사용해보기 -설치가 완료되면 몇 초 만에 이름 바꾸기가 가능합니다brew install rename
Simbamangu

4
's//'나에 관해서 는 이름 바꾸기가 작동하지 않았다 -나는 man을 참조했고 간단한 시놉시스가 있었다 : rename [options] expression replacement file..., CentOS 7, 버전 :rename from util-linux 2.23.2
tymik

2
.점이 아닌 모든 문자와 일치하는 점 을 명심하십시오. 리터럴 점의 경우 \.대신 사용하십시오
Meisner

11
for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done

1
사전에 드라 이런을하기에 좋습니다. 출력이 제정신으로 보이도록 먼저 두 번째 줄로 바 꾸었 mv $f $fnew습니다 echo $fnew.
lobati

10

순수한 bash 솔루션을 찾고 있습니까? 많은 접근 방식이 있지만 여기에 있습니다.

for file in *_h.png ; do mv "$file" "${file%%_h.png}_half.png" ; done

이것은 현재 디렉토리에서 끝나는 파일 만 _h.png이름을 바꾸려는 파일이라고 가정합니다 .

훨씬 더 구체적으로

for file in 0{5..6}_h.png ; do mv "$file" "${file/_h./_half.}" ; done

이 두 가지 예만 가정하면됩니다. 파일.

일반적인 경우를 들어, 파일의 이름을 변경 했다 되고 적용 하기 전에 .


6

renameperl로 작성된 유틸리티를 사용하십시오 . 그래도 기본적으로 사용할 수 없을 수도 있습니다 ...

$ touch 0{5..6}_h.png

$ ls
05_h.png  06_h.png

$ rename 's/h/half/' *.png

$ ls
05_half.png  06_half.png

4
for i in *_h.png ; do
  mv $i `echo "$i"|awk -F'.' '{print $1"alf."$2}'`
done

4

나는 비슷한 질문을했다 : 매뉴얼에서, 이름 바꾸기는

rename [option] expression replacement file

이런 식으로 사용할 수 있습니다

rename _h _half *.png

코드에서 '_h'는 찾고있는 표현식입니다. '_half'는 바꾸려는 패턴입니다. '* .png'는 가능한 대상 파일을 찾고있는 파일의 범위입니다.

이것이 c 도움이 될 수 있기를 바랍니다.


1

다른 방법은 배치 이름 바꾸기 옵션을 사용하여 수동으로 할 수 있습니다

파일-> 파일 사용자 정의 명령-> 배치 이름 변경을 마우스 오른쪽 버튼으로 클릭하면 h를 바꿀 수 있습니다. 반으로.

이것은 WinSCP 등을 사용하는 Linux 기반 GUI에서 작동합니다.


0

rename유틸리티를 사용하십시오 :

rc@bvm3:/tmp/foo $ touch 05_h.png 06_h.png
rc@bvm3:/tmp/foo $ rename 's/_h/_half/' * 
rc@bvm3:/tmp/foo $ ls -l
total 0
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 05_half.png
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 06_half.png

0

짧막 한 농담:
for file in *.php ; do mv "$file" "_$file" ; done


0

답변 세트 가 완료 되었지만 누락 된 다른 답변 을 추가해야합니다.

for i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.