적절한 정렬을 위해 한 번에 수백 개의 파일 이름 바꾸기


23

내가 파일의 톤과 같은 모든라는 이름의 물건을 가지고 1.jpg, 2.jpg, 3.jpg, 등까지에 1439.jpg, 그러나, 내 프로젝트 및 알파벳순 중 하나에 문제가있을 수. 그것은 일반적으로 순서대로 갈 것입니다 1.jpg, 10.jpg, 11.jpg등등.

내가 필요한 것은 파일의 이름을 정할 수 00001.jpg있는 방법 01439.jpg입니다.

이 작업을 빠르고 효율적으로 수행하려면 어떻게해야합니까?


당신이 찾고있는 것은 "자연적인 정렬"입니다. 아마 도움이 될 것입니다 : askubuntu.com/questions/41390/…
Fabian Blechschmidt

정답이 아닌 답변? ls -v unix.stackexchange.com/questions/33909/…
WernerCD

+1에서 실패 했으므로 시도했습니다 pyrenamer.
Parto

@ FabianBlechschmidt, 노틸러스 또는 유사하지 않은 프로그램에서 필요합니다. 개별 프로젝트를위한 것입니다.
Kaz Wolfe

자연 정렬을 구현하는 것에 대해 생각했다고 생각하십니까? 하지만 파일의 이름을 변경하는 것은 매우 쉽고, 이해가 : 큰 작업 않는 경우
파비안 Blechschmidt

답변:


35

우분투에는이라는 스크립트가 rename있습니다. 많은 강력한 대량 이름 변경 기능을 제공하는 작은 Perl 스크립트 일 뿐이지 만 가장 좋은 경우 (이 경우) 교체 중에 Perl을 실행할 수 있습니다. 결과는 진정으로 컴팩트 한 솔루션입니다.

rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

이것은 다른 printf스타일의 대답 과 비슷 하지만 모두 우리를 위해 처리됩니다. 위의 코드는 5 자리 숫자 (가변 숫자 0을 포함하여)입니다.

찾은 첫 번째 숫자 문자열을 0으로 채워진 버전으로 검색하고 바꾸고 나머지 파일 이름은 그대로 둡니다. 즉, 확장 또는 접두사를 전달하는 것에 대해 너무 걱정할 필요가 없습니다.

참고 : 이것은 완전히 이식 가능하지 않습니다. 많은 배포판 rename.ulutil-linux패키지에서 기본 rename바이너리로 사용됩니다. 이것은 man rename.ul위의 내용을 이해하지 못하는 상당히 번거로운 대안입니다 (참조 ). Perl의 이름 변경을 사용하지 않는 플랫폼에서 이것을 원한다면 먼저 설치하는 방법을 찾으십시오.


다음은 테스트 장치입니다.

$ touch {1..19}.jpg

$ ls
10.jpg  12.jpg  14.jpg  16.jpg  18.jpg  1.jpg  3.jpg  5.jpg  7.jpg  9.jpg
11.jpg  13.jpg  15.jpg  17.jpg  19.jpg  2.jpg  4.jpg  6.jpg  8.jpg

$ rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

$ ls
00001.jpg  00005.jpg  00009.jpg  00013.jpg  00017.jpg
00002.jpg  00006.jpg  00010.jpg  00014.jpg  00018.jpg
00003.jpg  00007.jpg  00011.jpg  00015.jpg  00019.jpg
00004.jpg  00008.jpg  00012.jpg  00016.jpg

그리고 예제 접두사 (우리는 다른 일을하지 않습니다) :

$ touch track_{9..11}.mp3 && ls
track_10.mp3  track_11.mp3  track_9.mp3

$ rename 's/\d+/sprintf("%02d", $&)/e' *.mp3 && ls
track_09.mp3  track_10.mp3  track_11.mp3

내가 Perl 사람이라면 이것이 완벽한 해결책이 될 것입니다. 정말 깔끔합니다.
MGP

2
펄을 사용하지 않고 이미 펄로 작성된 도구를 사용합니다.
Rob

1
이 경우 에는 단일 Perl 명령 포함되지만 정확히 무거운 것은 아닙니다. sprintfPerl sprintf에서 다른 언어 와 유사하게 작동 합니다.
Oli

21
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then  mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

편집하다

설명:

  • if [[ $f =~ [0-9]+\. ]] 이름이 숫자 인 파일 (점 뒤에 오는 파일) 만 이름이 바뀌도록합니다.
  • printf "%.5d" NUMBER 선행 0을 추가합니다
  • "${f%.*}" 확장자 (.jpg)를 자르고 숫자 만 남습니다.
  • .jpg두 번째 백틱 후에 파일 확장자가 다시 추가됩니다.

이것은 숫자 인 파일 이름에서만 작동합니다. 번호가 지정되지 않은 파일에 왼쪽 패딩 선행 0은 다른 형식이 필요합니다.

실험하려면 다음 명령을 시도하십시오.

for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then echo mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

편집 2

숫자 인 파일 이름 만 이름을 바꾸어 명령을 더 안전하게 만들었습니다. 00001.jpg와 같은 기존 파일은 덮어 씁니다.


이 하나의 라이너 스크립트는 우분투 및 기타 Linux 배포판에서 '바로 사용 가능'으로 작동합니다! 😃 perl, python 등을 사용하여 추가 도구를 설치할 필요가 없습니다.
HEXcube

6

파이썬 스크립트 아래.

스크립트는 정의 된 자릿수까지 앞에 0을 추가합니다. 이름이 그보다 큰 경우 파일 (이름)은 그대로 유지됩니다.

한 번의 이름 바꾸기 작업으로 다른 확장을 결합하면 약간의 편의가 추가 될 수 있습니다. 확장을 추가하려면 튜플에 확장을 추가하십시오 (예 :) extensions = (".jpg", ".jpeg", ".tiff").

텍스트를 빈 파일에 복사하고 다른 이름으로 저장 한 rename.py다음 파일 디렉토리의 올바른 경로 ( sourcedir), 새 이름을 가질 자릿수 ( number_ofdigits) 및 이름을 바꿀 파일 확장자 ( extensions)를 입력하십시오.

다음 명령으로 실행하십시오 :

python3 /path/to/script/rename.py

스크립트 :

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; number_ofdigits = 5; extensions = (".jpg", ".jpeg")

files = os.listdir(sourcedir)
for item in files:
    if item.endswith(extensions):
        name = item.split("."); zeros = number_ofdigits-len(name[0])
        newname = str(zeros*"0")+name[0]+"."+name[1]
        shutil.move(sourcedir+"/"+item, sourcedir+"/"+newname)

편집하다:

약간 개선 된 버전 아래. 디렉토리에서 가장 긴 이름을 자동으로 결정하고 가장 긴 이름의 길이까지 앞에 0을 추가합니다.

예:

1.jpg
12.jpg
123.jpg

된다 :

001.jpg
012.jpg
123.jpg

자릿수를 설정할 필요가 없습니다.

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; extensions = (".jpg", ".jpeg")
files = [(f, f[f.rfind("."):], f[:f.rfind(".")]) for f in os.listdir(sourcedir)if f.endswith(extensions)]
maxlen = len(max([f[2] for f in files], key = len))

for item in files:
    zeros = maxlen-len(item[2])
    shutil.move(sourcedir+"/"+item[0], sourcedir+"/"+str(zeros*"0")+item[0])

2

Perl에는 매우 쉬운 이름 바꾸기 유틸리티가 구현되어 있습니다.

rename 's/\d+/sprintf("%05d",$&)/e' *.jpg

첫 번째 인수는 각 파일 이름에 대해 평가되는 Perl 표현식입니다.


0

저장소에서 찾을 수있는 pyRenamer라고하는 GUI가 있습니다. 설치, 시작, 디렉토리를 선택하고 '패턴'탭에서 '이름이 바뀐 파일 이름 패턴'을 '{num5}'로 설정 한 다음 '이름 바꾸기'버튼을 클릭하십시오. 이름을 바꾸기 전에 어떤 일이 발생할지 미리 볼 수도 있습니다.


귀하의 답변이 효과가 있지만 이것은 shell-scripting섹션이므로 명령 줄 답변을 찾고 있음을 유의하십시오 . 또한 프로그램에 대한 자세한 정보를 제공 할 수 있습니까? 예를 들어, 어떤 패턴 형식 {num5}입니까?
Kaz Wolfe

-4
for file in `(find * -maxdepth 1 -type f -name "*.jpg")`     
do    
  mv $file "000"$file    
done

지능적으로 이름을 바꾸지 않기 때문에 이것은 트릭을 생각해야합니다. 그러나 물건을 정렬하는 데 도움이됩니다.

업데이트 : 더 완벽한 답변이 있습니다.


2
1439.jpg의 이름을 0001439.jpg로 바꿉니다.
Avinash Raj

예, 나는 여전히 정렬과 함께 작동 해야하는 여분의 0을 채 웠습니다.
Swarnendu Biswas는
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.