배치 이름 바꾸기 파일


150

이미지가 가득한 디렉토리가 있습니다.

image0001.png
image0002.png
image0003.png
...

그리고 하나의 라이너로 이름을 바꾸고 싶습니다 (예 :).

0001.png
0002.png
0003.png
...

어떻게해야합니까?


8
이것은 최고의 유닉스 커맨드 라인 FAQ 중 하나이며,이 사이트에서 찾을 수 없습니다. 커뮤니티 위키를 만들어야합니까?
Gilles

5
왜 그런지 모르겠습니다. 확인 가능한 답변이있는 특정 질문입니다.
인터넷 남자

3
X를 실행한다면 thunar -B *.pngthunar의 대량 이름 바꾸기 GUI 도구 보다 훨씬 쉬워지지 않습니다 .
dotjoe

@dotjoe 감사합니다. Thunar는 정말 흥미 롭습니다.
Volker Siegel

답변:


105

Bash 또는 기타 POSIX 호환 쉘을 사용하는 경우 :

for f in *.png; do
    mv -- "$f" "${f#image}"
done

2
이는 Mendel Coopers Advanced Bash 스크립팅 안내서 tldp.org/LDP/abs/html에
W_Whalley

2
@W_Whalley Wooledge Bash Guide 에 찬성하여 해당 가이드를 피하는 것이 좋습니다 .
와일드 카드

@Wildcard : ABS 가이드를 피해야하는 이유는 무엇입니까?
Christian Severin

나쁜 관행과 완전히 깨진 코드의 @ChristianSeverin 프로모션. 내 프로필 페이지에서 링크를 확인하십시오.
와일드 카드

이 예제를 다른 파일 패턴에 적용하는 방법을 모르는 경우 위에서 언급 한 안내서 의 매개 변수 확장 섹션 을 살펴볼 수 있습니다 .
lex82

108

데비안과 파생물에서 Perl의 rename작업은 다음과 유사합니다 sed.

  rename -v 's/image//' *.png

대신 다음과 같이 작동 하는 renamefrom 도 있습니다 util-linux.

  rename image '' *.png

6
이 프로그램은 설치해야 할 펄 프로그램이며 인수로 정규식을 사용한다고 설명해야합니다.

아, 나는 그것을 몰랐다. 나는 정식 답변
Internet man

5
rename프로그램은 Perl 예제 배포본에서 나온 것입니다. 데비안과 우분투는로 배송됩니다 /usr/bin/rename. 다른 유닉스 변종은 그것을 제공하지 않거나 완전히 다른 것을 제공 할 수 있습니다 /usr/bin/rename.
Gilles

1
일부 버전 rename걸릴 a를 에서 교체 패턴 :rename [options] <expression> <replacement> <file>...
혼합한다

1
데비안 기반 시스템을 사용하는 경우 sudo apt-get install rename을 사용하면 rename 명령을 사용할 수 있습니다. 파일 이름을 위해 sed입니다.
ctrl-alt-delor

41

zmv

zsh 쉘에는 강력한 배치 이름 바꾸기 명령이 zmv있습니다.

먼저 zmv다음과 같이 명령 을 활성화해야 합니다 (이것은로 갈 수 있습니다 ~/.zshrc).

autoload zmv

기본 구문은 zmv PATTERN REPLACEMENT입니다. 패턴은 쉘 글로브 표현식입니다. 패턴의 일부는 괄호로 묶을 수 있습니다. 대체 텍스트가 포함 할 수있는 $1, $2패턴의 N 번째 괄호에 그룹 등 참조. 예를 들면 다음과 같습니다.

zmv 'image(*.png)' '$1'

또한 자동으로 정의 zsh을 요청할 수 있습니다 $1, $2패턴에 와일드 카드 문자를 일치 등 :

zmv -w 'image*.png' '$1.png'

4
sweeeeeeeeeeeeeeeeeet. 또 다른 이유는 zsh를 배우고 있어야합니다.
ixtmixilix

1
@ixtmixilix 무엇을 배워야합니까? 그냥 사용하기 시작하고 prezto ( github.com/sorin-ionescu/prezto )를 추가하여 멋지게 만드십시오 .
Gerry

zmv의 남자가 지적한 것처럼 정말 시원합니다. mmv = 'noglob zmv -W'별칭을 mmv * .c.orig orig / *. c
Bretsko

사용 zmvprezto 것은에서 라인의 주석을 필요로 당신의 ~ / .zpreztorc 다음 # Set the Zsh functions to load (man zshcontrib).주는zstyle ':prezto:load' zfunction 'zargs' 'zmv'

33

나는 일반적 으로이 유스 케이스에 nice and simple mmv ( man page ) 유틸리티를 사용합니다.

$ mmv "image*.png" "#1.png"

당신의 작업을 수행합니다.

그만큼 #1타겟 패턴은 소스 패턴 와일드 일치대로 치환 될 것이다. 이것은 여러 와일드 카드에서도 작동하며 파일 이름의 일부 순서를 변경하는 데 사용할 수 있습니다. 소문자를 대문자로 변환하는 것과 같이보다 복잡한 작업을 쉽게 수행 할 수도 있습니다.

인용하여 쉘에서 패턴을 보호하십시오.


이 유틸리티를 지적 해 주셔서 감사합니다. 데비안, 우분투 및 Cygwin 저장소에서 찾았습니다. 매뉴얼 페이지에 문제가 있었지만 사용 방법을 설명하는 데 도움이되는 웹 페이지 와이 스택 오버플로 질문이 있습니다. stackoverflow.com/questions/417916/how-to-do-a-mass-rename
W_Whalley

감사합니다. 더 명확하게하기 위해 답변에 더 많은 정보를 추가했습니다.
Marcel Stimberg

3
충분히 찬성 할 수 없습니다! 너무 간단하고 친근합니다. homebrew에서 OS X에 사용 가능합니다.
Greg Dubicki

9

POSIX sh for 루프

sed를 사용하여 이름 바꾸기

for i in image*jpg
do 
  mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done

6

나는 Perl을 좋아한다.

perl -nlE '$old=$_; s/image//; qx(mv $old $_)'

파일을 다른 디렉토리에 복사하는 것과 같은 다른 작업에 동일한 패턴을 사용할 수도 있습니다.

perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'

2
또는 (safer!) :rename($old,$_)
reinierpost

5

qmv

명령 qmvrenameutils탭으로 구분 된 두 개의 열이있는 파일 이름 목록을 표시하는 편집기를 엽니 다. 각 행은 파일 이름 중 하나를 표시하며 두 열에서 동일합니다. 오른쪽 열은 파일의 새 이름을 나타냅니다.
변경하려면 오른쪽의 이름을 편집하십시오. 이 예에서, :%s/...또는 시각적 차단 모드가 도움이됩니다.

편집기의 파일 이름

$ qmv *.png

에디터에서 :

image0001.png           image0001.png
image0002.png           image0002.png
image0003.png           image0003.png         
~                                             
~                                             
~                                             
~                                             
"/tmp/user/1000/qmvxWyVMs" 3L, 93C

오른쪽 열의 이름 편집 :
( image비주얼 블록 모드를 사용하여 모든 줄 에서 접두사 제거 )

image0001.png           0001.png
image0002.png           0002.png
image0003.png           0003.png         
~                                             
~                                             
~                                             
~                                             
:wq

이름 변경 로그 :

image0001.png -> 0001.png
image0002.png -> 0002.png
image0003.png -> 0003.png

(예를 들어 우분투 : apt-get install renameutils)


3

재귀

image * png 파일을 쉽게 선택하고 파일 이름에서 줄 바꿈을 처리 할 필요가 없다고 가정

find . -name "image*.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done

안전하고 공백, 줄 바꿈, 백 슬래시 및 기타 사항을 처리 할 수 ​​있습니다 .

find . -name "image*.png" | while IFS= read -r f; do 
   mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; 
done

1

while 루프를 사용하여 POSIX sh

find명령 에서 이름을 읽습니다 .

find . -maxdepth 1 -type f -name 'image*png' | while IFS= read -r f; do
  mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"
done

파일에서 이름 읽기

while IFS= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^\.\/image//' - )"; done < flist


1

내용은 Windows 및 Linux ,이 펄 스크립트는 할 것입니다; 이 경우 :

$ rnm -l 's/^image//' '*.png'

스크립트는 디렉토리에서 재귀 적으로 실행될 수 있으며 모든 디렉토리 에 카운트를 추가 할 수도 있습니다.

$ rnm -r 's/^/$counter./' '/\.png$/'

UTF-8 문자도 Windows와 Linux 모두에서 올바르게 처리됩니다.


0

이 도구를 사용할 수 있습니다 : rnm ( 웹 페이지 )

귀하의 경우 명령은 다음과 같습니다.

rnm -rs '/^image//' *.png

여기에서 더 많은 예제 / 문서를 찾을 수 있습니다 .


0

정규식 (Windows, Linux 및 OS X 지원)을 통해 파일 / 디렉토리의 이름을 안전하게 일괄 변경하기위한 실용적인 크로스 플랫폼 명령 줄 도구 인 brename ( https://github.com/shenwei356/brename )을 사용해보십시오 .

@patrickDurusau 는 다음과 같이 말했습니다.

Linux에는 다양한 배치 파일 이름 변경 옵션이 있지만 필자의 이름이 부족하다는 단점은 보지 못했습니다.

풍모:

  • 크로스 플랫폼 . Windows, Mac OS X 및 Linux 지원
  • 안전 합니다. 잠재적 인 충돌 및 오류확인합니다 .
  • 파일 필터링 . 정규식을 통한 파일 포함 및 제외 지원 와 같은 명령을 실행할 필요가 없습니다 find ./ -name "*.html" -exec CMD.
  • 키 값 파일을 통해 값을 대응 submatch 바꾸기 .
  • 상승 정수를 통해 이름 변경 .
  • 재귀 적으로 파일 및 디렉토리의 양쪽 모두의 이름을 변경 .
  • 드라 이런 지원 .
  • 다채로운 출력 .

명령:

$ brename -f .png -p image
[INFO] checking: [ ok ] 'image0001.png' -> '0001.png'
[INFO] checking: [ ok ] 'image0002.png' -> '0002.png'
[INFO] checking: [ ok ] 'image0003.png' -> '0003.png'
[INFO] 3 path(s) to be renamed
[INFO] renamed: 'image0001.png' -> '0001.png'
[INFO] renamed: 'image0002.png' -> '0002.png'
[INFO] renamed: 'image0003.png' -> '0003.png'
[INFO] 3 path(s) renamed

-5

ls * png | 읽는 동안 -rf; f2 = "`echo $ f | sed -e 's / image // '`"; mv $ f $ f2; 끝난


잘못된 것 : "mv : 'image0001.png'다음에 대상 파일 피연산자가 없음"
Internet man

3
코드에 많은 문제가 있습니다. 출력을 파싱하는 ls것은 단지 문제를 요구합니다. read이어야합니다 read -r. 모든 변수 대체는 큰 따옴표 안에 있어야합니다.
Gilles

보다 효과적으로 이것을 쓸 수 for f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; done있습니다. 파싱 ls은 필요 하거나 좋은 생각 이 아닙니다 .
kojiro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.