연도를 끝에서 처음으로 이동할 대량 이름 바꾸기 디렉토리


11

현재 일부 음악 폴더로 어려움을 겪고 있습니다. 한 번 패턴에 따라 이름을 지정하기로 결정했습니다 artist - album - year. 나는 이것이 현명한 움직임이 아니라는 것을 깨달았고 이제는 디렉토리를 패턴에 따라 이름을 짓고 싶다 : year - artist - album목록에 오름차순으로 표시됩니다.

손으로 이름 바꾸기를 시작했지만 약 700 개의 폴더로 더 간단한 방법이 있어야합니다. 나는 사용하려고 시도 gprename했지만 정규 표현식과 bash 스크립팅에 능숙하지 않다 ...

내 손끝을 아끼지 않도록 도와 줄 사람이 있습니까?

몇 가지 예 :

Aes Dana - Memory Shell - 2004 
Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009

될 것이다

2004 - Aes Dana - Memory Shell
2009 - Anja Schneider & GummiHz - Back To Back (Remixes Part 2)

편집 : 일부 아티스트 및 앨범 이름과 같은 특수 문자가 And.Id또는 Kool & The Gang. 모든 디렉토리에는 -구분자가 있습니다.


2
예제 디렉토리 이름과 예상 출력을 추가하십시오.
muru

예를 들어 : "Aes Dana-Memory Shell-2004"가 있고 "2004-Aes Dana-Memory Shell"
TazMayhem

1
질문을 편집하는 방법을 알고 있으므로 질문에 추가하지 않겠습니까? 또한 앨범이나 아티스트 이름이 -있습니까?
muru

이름이 "-"구분 기호로 정의되어 정의되어 있으며 이름의 다른 곳에서 발생할 수 있습니까?
Jacob Vlijm

소스 폴더를 텍스트 파일로 리디렉션하고 vim을 사용하는 경향이 있습니다. 소스 폴더의 관련 구성 요소가 올바른 순서로 각 줄에 대한 두 번째 매개 변수를 만드는 매크로를 만든 다음 다른 매크로를 사용하여 각 줄의 시작 부분에 mv를 넣습니다. 폴더를 엉망으로 만들거나 잃어버린 경우 폴더 구조의 사본을 먼저 가져갈 수 있습니다.

답변:


16

펄에 액세스 할 수 있다고 가정하면 rename(일반적으로 우분투에서 사용할 수 있습니다-차이점을 명확하게 해준 @ Serg 덕분에. 의심스러운 경우 전화 /usr/bin/rename하면 올바른 것을 얻을 수 있습니다) 다음을 사용할 수 있습니다.

rename -n 's/(.*) - (\d{4})\//$2 - $1/' */

-n실제로 디렉토리 이름을 바꾸려면 테스트 후 제거하십시오 . 이것은 모든 앨범의 날짜가 1000에서 9999 사이 인 것으로 가정합니다. 아마도 합리적입니다 ...

설명

  • s/old/new교체 oldnew
  • (.*)$1나중에 참조 할 수있는 문자 수를 저장하십시오
  • (\d{4})\/$2나중에 참조 할 수 있도록 줄 끝에 네 자리를 저장하십시오 .
  • */ 모든 디렉토리와 일치 (파일이 아님-도움을 주신 @muru 덕분에!)

3
*/디렉토리 만 일치시킬 수도 있습니다.
muru

@muru 작동하지 않는 것 같습니다! 내가 멍청하게 뭐하는거야?
Zanna

1
@Zanna 나는 그들이 말하는 것을 얇게 mksh만들었습니다 rename. 전체 경로로 대체하거나 전화를하기에 충분하다 prename펄 이름 바꾸기 전화
세르지 Kolodyazhnyy

1
@Zanna이 흥미로운 비트를 찾았습니다 : unix.stackexchange.com/a/229248/85039 TL; DR : rename"때때로 prename"는 아니지만 같은 스크립트의 두 가지 "지점"인 것 같습니다. 하나는 유지되지 않습니다. 데비안과 다른 하나입니다. 그래 . . 그것은 너무 혼란스러워-일부 쉘은 자체 rename, 펄 패키지는 자체 rename, 데비안 자체는 별도의 패키지를 제공합니다
Sergiy Kolodyazhnyy

1
@ 잔나 나는 unix.stackexchange.com/q/229230/21167 rename.ul에서 언급 된 프로그램을 생각하고 있었다
zwol

6

간단한 Python 스크립트는 다음과 같은 작업을 수행 할 수 있습니다.

$ tree
.
├── Aes Dana - Memory Shell - 2004
├── Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009
└── rename_dirs.py

2 directories, 1 file
$ ./rename_dirs.py */
$ tree
.
├── 2004 - Aes Dana  -  Memory Shell 
├── 2009 - Anja Schneider & GummiHz  -  Back To Back (Remixes Part 2) 
└── rename_dirs.py

스크립트 내용 :

#!/usr/bin/env python
from shutil import move;
import sys

for i in sys.argv[1:] :
    parts = i[:-1].split('-')
    year = parts[-1].strip()
    new_name = year + " - " + " - ".join(parts[:-1]).strip()
    move(i,new_name)

작동 원리 :

  • 주요 트릭은 대상이있는 동일한 디렉토리에서 스크립트를 실행하는 것입니다. 또한 */스크립트에 인수로 디렉토리 만 제공하도록 전달 합니다.
  • 이 스크립트는 모든 명령 줄 인수를 반복하여 각 파일 이름을 -문자 로 된 문자열 목록으로 분류합니다 . 새로운 파일 이름은 추출한 부분으로 구성됩니다.
  • move()shutils모듈의 기능은 실제로 디렉토리의 이름을 바꾸는 것입니다.

사용법에 유의하십시오. ./rename_dirs.py */

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