쉘을 사용하여 파일 이름의 단어를 바꾸는 방법은 무엇입니까?

쉘을 사용하여 파일 이름의 단어를 바꾸는 방법은 무엇입니까?

내 고객 중 하나는 학교입니다. 파일 서버에서 모든 프로젝트에는 동일한 명명 체계를 가진 디렉터리가 있습니다.

<성>, <이름> <두 번째 이름>? - <프로젝트 설명>

예를 들어:

Miller, John Andrew - 긴 프로젝트 설명
Willis, Bruce - 설명, 쉼표를 포함할 수 있음
Lewis, Mary Jane - 설명 - 빼기 기호 포함

새로운 명명 규칙은 다음과 같습니다.

<이름> <2위>? <성> - <프로젝트 설명>

예를 들어:

John Andrew Miller - 긴 프로젝트 설명
브루스 윌리스(Bruce Willis) - 설명, 쉼표를 포함할 수 있음
Mary Jane Lewis - 설명 - 빼기 기호 포함

이제 모든 기존 폴더의 이름을 새로운 규칙으로 일괄 변경하는 방법은 무엇입니까?

답변1

파일 이름의 설명 부분에는 패턴 -(두 공백 사이의 하이픈)이 포함될 수 있으므로 특정 기호로 변경할 수 있습니다.아니요설명 섹션에 나타납니다. 를 선택했지만 £순전히 임의적이었습니다.

rename 's/ - /£/' *
rename 's/([^,]*), ([^£]*)£/$2 $1 - /' *

s/ - /£/' tells rename to replace the first instance of- it finds with£ . The second command is a bit more complicated. Parenthases (() ) are used to group selections together -- so everything that matches the pattern within the first set of parens can be called later as$1 (all the way up to$9 ).[^,] means 'any character, except for,';means 'zero or more of the previous character';[^,]`는 "쉼표를 제외한 모든 문자가 0개 이상 있음"을 의미합니다. 이름 바꾸기는 기본적으로 탐욕적이므로 가능한 가장 긴 문자열과 일치합니다.

나머지는 자연스럽게 나오는 것 같아요.

파일 이름에 기호가 나타나는지 확실하지 않은 경우 다음을 실행하세요.

printf '%s\n' *£*

Perl-rename이 있는 경우:

rename 's/([^,]*), (.*) - /$2 $1 - /' *

파일 이름의 설명 부분에 -(예: -두 공백 사이에 a가 포함된 경우) 문제가 발생합니다.

테스트를 위해 이 플래그를 사용해야 합니다 -n. 파일 이름은 바뀌지 않지만 해당 내용이 표시됩니다.회의완성된:

rename -n 's/([^,]*), (.*) - /$2 $1 - /' *

답변2

매칭에 관한 한, 강력한 것을 구축하려면 매우 주의해야 합니다. 예를 들어 이름과 중간 이름을 가정해 보겠습니다.

  1. 문자로 시작해야 합니다.
  2. 하이픈을 포함할 수 있습니다(단, 다른 구두점이나 공백은 포함할 수 없음).

이름 패턴은 다음과 같습니다 . 추가 비캡처 그룹 구조는 중간 이름이 비어 있을 때 캡처 그룹 번호 지정 연속성을 유지하는 데 도움이 되므로 [[:alpha:]][[:alpha:]-]*선택적으로 공백으로 구분된 중간 이름을 만들 수 있습니다 . ((?: [[:alpha:]][[:alpha:]-]*)?)예를 들어 Perl 기반 rename 명령을 사용하여 함께 묶습니다.

rename -nv -- 's/(^[^,]*), ([[:alpha:]][[:alpha:]-]*)((?: [[:alpha:]][[:alpha:]-]*)?)/$2$3 $1/' *

또는 (단일 공백 ​​대신 필드 사이에 더 일반적인 공백을 허용)

rename -nv -- 's/(^[^,]*),\s+([[:alpha:]][[:alpha:]-]*)((?:\s+[[:alpha:]][[:alpha:]-]*)?)/$2$3 $1/' *

-n스위치는 작동하지 않습니다. 즉, 제거될 때까지 실제로 이름 바꾸기를 수행하지 않습니다. Perl 기반 이름 바꾸기 기능이 없으면 perl및 를 조합 하여 사용할 수 있습니다 mv.

관련 정보